我有一个适用于 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 个单独的罐子有两个原因:
- 尝试制作适用于 Java8 和 Java9 的交叉编译源代码库。你最终会得到像
java
,java8
和java9
... 这样的文件夹,然后让构建产生两个罐子,两个 pom... 是的,祝你好运。 - 想象一下,我什至为 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.jar
和A.jar9
一起作为一个包。不需要META-INF/versions
。很干净。而且,最重要的是,它会在上述情况下有所帮助!如果在 Java8 上运行,jar9
jar 没有任何区别;如果在 Java9 上运行,jar9
jar 将jar
使用相同的名称修补。就那么简单。没有传递依赖地狱。
- 重命名
META-INF/versions
.
Common Oracle,你听说过类路径扫描吗?您至少可以将类重命名versions
为例如*.class9
,以免被现有的类路径扫描器捕获。