对不推荐使用的JavaEE模块有选择地使用第三方实现
我目前正在移植一个与JDK9+兼容的开源库,它依赖于一些Java EE模块,这些模块在Java 9中已被弃用,在Java 11中已被删除:特别是JAXB、JAX-WS和javax.annotation 我向第三方实现添加了显式依赖项,建议如下:对不推荐使用的JavaEE模块有选择地使用第三方实现,java,maven,jakarta-ee,java-9,java-11,Java,Maven,Jakarta Ee,Java 9,Java 11,我目前正在移植一个与JDK9+兼容的开源库,它依赖于一些Java EE模块,这些模块在Java 9中已被弃用,在Java 11中已被删除:特别是JAXB、JAX-WS和javax.annotation 我向第三方实现添加了显式依赖项,建议如下: com.sun.xml.ws ,但看起来它们是用于项目类之间的依赖于jdk版本的实现,而不是依赖关系之间的实现 另外,如果无法在JDK 8上使用认可的实现,是否有一种方法可以可靠地测试使用第三方实现不会引入任何回归 有没有办法生成一个使用第三方的jar
com.sun.xml.ws
,但看起来它们是用于项目类之间的依赖于jdk版本的实现,而不是依赖关系之间的实现
另外,如果无法在JDK 8上使用认可的实现,是否有一种方法可以可靠地测试使用第三方实现不会引入任何回归
有没有办法生成一个使用第三方的jar文件
JDK9+上的实现和JDK8上认可的实现
不幸的是,没有。当通过jar文件分发库时,您无法控制其他jar和库如何在类路径中列出。这使得类加载对您来说是不确定的。这对于您的情况意味着,如果上述库包含在JDK8环境中的类路径中,则无法确定或控制加载的类的版本
此外,如果无法在上使用经认可的实现
JDK 8,有没有一种方法可以使用第三方可靠地测试它
实现不引入任何回归
作为作者,您可以在不同的运行时环境中执行测试以检查回归
我是否应该发布两个不同的JAR,一个使用JavaEE第三方
包括JDK9+和JDK8的实现吗
这是一个完全合理的解决方案,其他人以前也使用过。以sqlserver jdbc JAR为例,它基于jre有不同的版本:
对于这里描述的情况,JDK9+版本的jar可以声明您在问题中提到的其他依赖项,而JDK8版本则不能
另一种选择是使用一个jar,并声明您提到的依赖项。这将向使用者发出信号,表明运行时环境必须包含声明的依赖项中的类。需要一些文档来指导库的使用者何时必须显式地将声明为提供的JAR添加到其类路径中
依我看,最清晰的解决方案是两个jar,在jar名称中引用JRE版本,并具有不同的依赖关系。它只需要很少的文档(大多数人都不看)。而且它允许您更自由地对库进行更改。您可以详细介绍一下步骤吗,但我希望我的库仅在必要时使用它们,并继续使用JDK8?上认可的实现。。我应该发布两个不同的罐子吗。。是的,您可以。是否有一种方法可以可靠地测试使用第三方实现不会引入任何回归?。。这将是用户(您)的尝试,这不是开源社区的工作方式吗?也许您可以具体说明您正在使用的实现,并使用MR-JARs解决它。但是,除非您知道依赖于(哪些)JavaEE模块的是什么,否则无法对其进行进一步评论。您可以保留依赖项可选,并建议为Java 11以后的版本添加哪一个。为Java 8和Java 9+创建2个单独的版本。这就是我们在将框架从Java8升级到Java10时所做的。
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-ri</artifactId>
<version>2.3.0.1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-ri</artifactId>
<version>2.3.0.1</version>
</dependency>
<dependency>
<groupId>com.sun.activation</groupId>
<artifactId>javax.activation</artifactId>
<version>1.2.0</version>
</dependency>