避免加载与传递相关的模块

时间:2017-11-13 07:06:36

标签: java java-9 java-module

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

1 个答案:

答案 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 很快就会被删除 - 它已被弃用以便删除。

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

长期解决方案

因此,对于长期解决方案,您应该删除对 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一起添加到类路径中将起作用,因为所有类路径内容最终都在同一个模块(未命名的模块)中,因此拆分包那里没问题。