有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java有选择地为不推荐的JavaEE模块使用第三方实现

我目前正在移植一个与JDK9+兼容的开源库,它依赖于一些JavaEE模块,这些模块在Java9中已被弃用,在Java11中已被删除:特别是JAXB、JAX-WS和javax。注释

我向第三方实现添加了显式依赖项,如建议的here

<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>

但是,我希望我的库仅在必要时使用它们(即在JDK9+上),并继续使用JDK8上认可的实现

我可以通过在Maven概要文件中添加依赖项来实现这一点,这些依赖项只在JDK 9和更高版本上激活,但是如果我想在Maven Central上发布我的库的jar文件呢?我是否应该为JDK9+发布两个不同的JAR,一个包含JavaEE第三方实现,另一个不包含JDK8

有没有办法生成一个jar文件,使用JDK9+上的第三方实现和JDK8上认可的实现

我已经研究了multi-release jars,但看起来它们是用于项目类之间的依赖于jdk版本的实现,而不是依赖性之间的实现

另外,如果无法在JDK 8上使用认可的实现,是否有一种方法可以可靠地测试使用第三方实现不会引入任何回归


共 (1) 个答案

  1. # 1 楼答案

    Is there a way to produce a jar file that will use the third party implementations on JDK9+ and the endorsed ones on JDK8?

    不幸的是,没有。当通过jar文件分发库时,您无法控制其他jar和库如何在类路径中列出。这使得类加载对您来说是不确定的。这对于您的情况意味着,如果上述库包含在JDK8环境中的类路径中,则无法确定或控制加载的类的版本

    Also, in case it's not possible to use the endorsed implementations on JDK 8, is there a way to reliably test that using the third party implementations does not introduce any regressions?

    作为作者,您可以在不同的运行时环境中执行测试以检查回归

    Should I publish two different jars, one with the Java EE third party implementations included, for JDK9+ and one without for JDK8?

    这是一个完全合理的解决方案,其他人以前也使用过。以SQLServerJDBCJAR为例,它基于jre有不同的版本:https://docs.microsoft.com/en-us/sql/connect/jdbc/using-the-jdbc-driver?view=sql-server-2017 对于这里描述的情况,JDK9+版本的jar可以声明您在问题中提到的其他依赖项,而JDK8版本则不能

    另一种选择是使用一个jar,并声明您提到的依赖项。这将向使用者发出信号,表明运行时环境必须包含声明的依赖项中的类。需要一些文档来指导库的使用者何时必须显式地将声明为提供的JAR添加到其类路径中

    依我看,最清晰的解决方案是两个jar,在jar名称中引用JRE版本,并具有不同的依赖关系。它只需要很少的文档(大多数人都不看)。它允许您更自由地对库进行更改