我正在使用 JDK 9.0.1 编译我的旧源代码,如下所示:
javac --add-modules=java.base,java.xml.ws -cp lib\jsr305.jar;lib\javax.annotation-api-1.2.jar TestJava.java
它给出了一个错误,因为由于拆分模块问题,其中定义的注释jsr305.jar
不可见。错误如下:
TestJava.java:3: error: cannot find symbol
import javax.annotation.Nonnull;
^
symbol: class Nonnull
location: package javax.annotation
这里模块java.xml.ws.annotation
正在加载,因为它是java.xml.ws
. 所以它忽略了jsr305.jar
. 我不希望加载此模块,而是从javax.annotation-api-1.2.jar
. 我也不想这样做--patch-module
,因为它会在未来的版本中中断。
如果我使用--limit-module=java.xml.ws.annotation
它会给出同样的错误。如果我从中删除java.xml.ws
,-add-modules
它会成功编译,但我需要从中导出一些 API,因此无法删除它。有什么办法可以加载模块java.xml.ws
但不是java.xml.ws.annotation
吗?
编辑:我想我通过给出 java.xml.ws.annotaion 和 jsr305.jar 之间的拆分示例增加了一些混淆。虽然这是我的实际问题,但我更感兴趣的是 - 我可以避免加载传递依赖的模块,比如加载java.xml.ws
而不加载java.xml.ws.annotation
吗?根据我在 JEP 261 中的理解,它说,
--limit-modules <module>(,<module>)*
<module>
模块名称在哪里。此选项的效果是将可观察模块限制为命名模块的传递闭包中的模块加上主模块(如果有)以及通过 --add-modules 选项指定的任何其他模块。
那么,为什么不--limit-module
阻止java.xml.ws.annotation
加载呢?