MR-Jars 可以覆盖其他 jar 中的 类 吗?
Can MR-Jars overwrite classes from other jars?
我有一个适用于 Java 8.
的罐子
我想创建一个 new jar,它将是多版本 JAR,但它是空的,只有 'patched' 类 在 META-INF/versions
.
我想要一个单独的 jar,以便人们可以将其包含在 Java9 中,否则,他们将使用默认的。为什么?因为还没有为 Java9 MR-Jars 准备这么多工具。
这可能吗? Java9 MR-Jar 会覆盖其他 jar 的 类 吗?
为什么?
Multi-Release jar 背后的想法是它们提供简单的补丁。以我拙见,MR jars 的工作方式并不令人满意。
我不能制作 2 个单独的 Jars 的原因有两个:
- 尝试制作适用于 Java8 和 Java9 的交叉编译源代码库。你最终会得到像
java
、java8
和 java9
这样的文件夹...然后让构建生成两个 jar,两个 poms...是的,祝你好运。
- 想象一下,我什至为 java9 构建了一个库。瞬态依赖性呢?这意味着 所有其他使用我的库 的
jre8
版本需要依赖于我的 jre8
版本。就因为有Java9版!
故事是这样的:
我的 A
是一个基于 Java8 构建的 Java 库,但打包为多版本 Jar,这意味着它包含额外的 类 用于当 jar 是 运行 在 Java9 上。额外的 类 是在 JDK9 上单独构建的,我手动复制了它们(是的,我知道,但现在可以使用)。
不幸的是,一些工具和服务器 (Jetty) 不知道 MR Jars,这使得它们 NOT 工作。
出于这个原因,我有 A-jre8
版本的库,没有任何额外的 类,因此服务器可以使用它。
但是,如果用户正在使用依赖于我的 A
的库 B
,他仍然会得到 A
的 MRJar 版本,这将再次失败。我希望能够以某种方式阻止这种情况。我不能对 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
中重命名 类。
普通Oracle,听说过类路径扫描吗?您能否至少将 versions
中的 类 重命名为例如*.class9
这样就不会被现有的类路径扫描器捕获。
就像今天一样 (Java v9.0.4) - 没有。
我有一个适用于 Java 8.
的罐子我想创建一个 new jar,它将是多版本 JAR,但它是空的,只有 'patched' 类 在 META-INF/versions
.
我想要一个单独的 jar,以便人们可以将其包含在 Java9 中,否则,他们将使用默认的。为什么?因为还没有为 Java9 MR-Jars 准备这么多工具。
这可能吗? Java9 MR-Jar 会覆盖其他 jar 的 类 吗?
为什么?
Multi-Release jar 背后的想法是它们提供简单的补丁。以我拙见,MR jars 的工作方式并不令人满意。
我不能制作 2 个单独的 Jars 的原因有两个:
- 尝试制作适用于 Java8 和 Java9 的交叉编译源代码库。你最终会得到像
java
、java8
和java9
这样的文件夹...然后让构建生成两个 jar,两个 poms...是的,祝你好运。 - 想象一下,我什至为 java9 构建了一个库。瞬态依赖性呢?这意味着 所有其他使用我的库 的
jre8
版本需要依赖于我的jre8
版本。就因为有Java9版!
故事是这样的:
我的 A
是一个基于 Java8 构建的 Java 库,但打包为多版本 Jar,这意味着它包含额外的 类 用于当 jar 是 运行 在 Java9 上。额外的 类 是在 JDK9 上单独构建的,我手动复制了它们(是的,我知道,但现在可以使用)。
不幸的是,一些工具和服务器 (Jetty) 不知道 MR Jars,这使得它们 NOT 工作。
出于这个原因,我有 A-jre8
版本的库,没有任何额外的 类,因此服务器可以使用它。
但是,如果用户正在使用依赖于我的 A
的库 B
,他仍然会得到 A
的 MRJar 版本,这将再次失败。我希望能够以某种方式阻止这种情况。我不能对 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
中重命名 类。
普通Oracle,听说过类路径扫描吗?您能否至少将 versions
中的 类 重命名为例如*.class9
这样就不会被现有的类路径扫描器捕获。
就像今天一样 (Java v9.0.4) - 没有。