3

我正在使用 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加载呢?

4

1 回答 1

2

我知道没有办法阻止传递依赖的解决。

短期修复

您应该能够通过使用--patch-module java.xml.ws=lib\jsr305.jar:lib\javax.annotation-api-1.2.jar. 我的意见:如果你只是想让你的构建在 Java 9 上运行,那是一个不错的选择。如果您想在生产中使用它,这有点可疑,但仍然可以接受。

如果您担心长期兼容性:

  • 我认为--patch-module不会很快消失-您有消息来源吗?
  • 我很确定java.xml.ws很快就会被删除——它已经被弃用了。

在你的位置,我更担心模块而不是修补它。

长期解决方案

因此,对于长期解决方案,您应该删除对j​​ava.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,加上 javax.xml.soap:用于 SAAJ 的 javax.xml.soap-api 和 javax.xml:用于 Web 服务元数据的 webservices-api)
  • javax.xml.bind : jaxb-api (JAXB)
  • javax.activation : javax.activation-api (JAF)
  • javax.annotation : javax.annotation-api(通用注解)

将 API JAR 或引用实现与所有其他javax.annotation相关 JAR 一起添加到您的类路径将起作用,因为所有类路径内容最终都在同一个模块(未命名的模块)中,因此拆分包在那里没有问题。

于 2017-11-13T09:07:10.480 回答