【问题标题】:Can MR-Jars overwrite classes from other jars?MR-Jars 可以覆盖其他 jar 中的类吗?
【发布时间】:2018-02-05 03:01:58
【问题描述】:

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

我想创建一个 new jar,它将是 Multi-Release JAR,但为空,只有 META-INF/versions 中的“修补”类。

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

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

为什么?

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

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

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

故事如下:

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

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

出于这个原因,我有我的库的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中的类。

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

【问题讨论】:

  • 好问题。 :) 如果您愿意为 Java 9 创建一个额外的 JAR,为什么不简单地为 9 提供一个?那不是更容易吗?
  • 同意@Nicolai,反正你是在创建 2 个罐子,为什么不让它们自给自足。一个用于 Java8 及更低版本(根据您支持的版本),另一个可能是 Java9 及以上版本的 MR-JAR。
  • 另外,要回答 MR-JAR 将覆盖其他 JAR 中的类的问题,在我的理解中应该是不,不应该。。我可以想到很多冲突,就像您可能会尝试创建相同名称的 jars(相同的模块名称),如果您避免这样做,那么来自不同模块(拆分包)的相同包名称可能是一个问题,即使我是无法看到您将如何解决上述两个问题,然后(大声思考)属性Multi-Release 将适用于您的 Java9-jar,它不会意识到覆盖来自另一个包(来自另一个 jar)的类。
  • @Nicolai 请查看我的更新,为什么我不能使用 Java9 的附加 JAR。如果您知道如何在多模块 java 项目中进行交叉编译,请告诉我。
  • 如何使用--patch-module <module>=<file>(<pathsep><file>)* 执行 Java9,同时让这些 jar 在使用 Java8 执行时保持不变(无论如何都会忽略 MR Jar META-INF/versions/9/)。还没有尝试过,但理论上似乎可以使用 A9.jar 修补模块形式 A8.jar。

标签: jar java-9 multi-release-jar


【解决方案1】:

现在 (Java v9.0.4) - 没有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 2017-07-19
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多