我正在使用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
由于split module问题导致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
加载?
答案 0 :(得分:2)
我知道无法阻止传递依赖的解决方法。
您应该可以patching the module使用Object of class Illuminate\Routing\Redirector could not be converted to string
使其正常工作。我的观点:如果你只是想让你的构建工作在Java 9上,这是一个不错的选择。如果你想在生产中使用它,它有点可疑但仍然可以接受。
如果您担心长期兼容性:
--patch-module java.xml.ws=lib\jsr305.jar:lib\javax.annotation-api-1.2.jar
会很快消失 - 你有消息来源吗?在你的位置,我担心模块不仅仅是修补它。
因此,对于长期解决方案,您应该删除对 java.xml.ws 的依赖。 JDK-8189188有一个关于此的部分(有很多链接,我懒得复制):
JAX-WS和JAXB的参考实现(RI)是一个很好的起点,因为它们是JDK 9中java.xml.ws和java.xml.bind模块的完全替代.RI可用作Maven工件:(请注意,它们必须部署在类路径上)
- com.sun.xml.ws:jaxws-ri(JAX-WS,加上SAAJ和Web服务元数据)
- com.sun.xml.bind:jaxb-ri(JAXB)
JAX-WS和JAXB的工具也可用作Maven工件:
- wsgen和wsimport:com.sun.xml.ws:jaxws-tools,以及工具脚本
- schemagen和xjc:com.sun.xml.bind:jaxb-jxc和com.sun.xml.bind:jaxb-xjc,以及工具脚本
还有Maven工件只包含Java EE技术的API:
- javax.xml.ws:jaxws-api(JAX-WS,以及用于SAAJ的javax.xml.soap:javax.xml.soap-api和用于Web服务元数据的javax.xml:webservices-api)
- javax.xml.bind:jaxb-api(JAXB)
- javax.activation:javax.activation-api(JAF)
- javax.annotation:javax.annotation-api(Common Annotations)
将API JAR或引用实现与所有其他--patch-module
相关的JAR一起添加到类路径中将起作用,因为所有类路径内容最终都在同一个模块(未命名的模块)中,因此拆分包那里没问题。