3

我有一个适用于 Java 8 的 jar。

我想创建一个的jar,它将是 Multi-Release JAR,但为空,只是在META-INF/versions.

我想要一个单独的 jar,所以人们可以将它包含在 Java9 中,否则,他们使用默认的。为什么?因为还没有为 Java9 MR-Jars 准备这么多工具。

这可能吗?Java9 MR-Jar 会覆盖其他 jar 中的类吗?

为什么?

Multi-Release jars 背后的想法是它们提供简单的补丁。在我看来,MR jars 的工作方式并不令人满意。

我不能制作 2 个单独的罐子有两个原因:

  1. 尝试制作适用于 Java8 和 Java9 的交叉编译源代码库。你最终会得到像java,java8java9... 这样的文件夹,然后让构建产生两个罐子,两个 pom... 是的,祝你好运。
  2. 想象一下,我什至为 java9 构建了一个库。那么瞬态依赖呢?这意味着使用我的所有其他库都需要具有jre8取决于我的版本的jre8版本。就因为有Java9版本!

这是故事:

MyA是一个基于 Java8 构建的 Java 库,但打包为 Multi-Release Jar,这意味着当 jar 在 Java9 上运行时,它包含额外的类。其他类是在 JDK9 上单独构建的,我手动复制了它们(是的,我知道,但现在可以使用)。

不幸的是,一些工具和服务器(Jetty)不知道 MR Jars,这使得它们无法工作

出于这个原因,我有A-jre8我的库版本,它没有任何额外的类,所以服务器可以使用它。

但是,如果用户使用B依赖于 my的库A,他仍将获得 MRJar 版本,A这将再次失败。我希望能够以某种方式防止这种情况。我不能说B:嘿,你能做到B-jre8吗?

可能的解决方案

JAR 只是关于包装!

  • 允许单独的 jar 修补现有的 jar。

就我而言,我只会包含A.jar9和 Java 会考虑A.jarA.jar9一起作为一个包。不需要META-INF/versions。很干净。而且,最重要的是,它会在上述情况下有所帮助!如果在 Java8 上运行,jar9jar 没有任何区别;如果在 Java9 上运行,jar9jar 将jar使用相同的名称修补。就那么简单。没有传递依赖地狱。

  • 重命名META-INF/versions.

Common Oracle,你听说过类路径扫描吗?您至少可以将类重命名versions为例如*.class9,以免被现有的类路径扫描器捕获。

4

1 回答 1

1

就像今天一样(Java v9.0.4) -没有

于 2018-02-04T19:01:58.737 回答