MR-Jars可以覆盖其他罐子里的类吗?

时间:2018-02-02 20:36:52

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

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

我想创建一个 new jar,它将是Multi-Release JAR但是空的,只需要修补' META-INF/versions中的课程。

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

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

为什么?

Multi-Release jar背后的想法是它们提供简单的补丁。以我的拙见,MR罐子的工作方式并不令人满意。

我有两个原因可以制作2个独立的罐子:

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

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

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

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

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

    可能的解决方案

    JAR只是打包!

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

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

    • 重命名META-INF/versions
    • 中的课程

    普通的Oracle,你听说过类路径扫描吗?您是否至少可以将versions中的类重命名为例如*.class9所以不要被现有的类路径扫描程序捕获。

1 个答案:

答案 0 :(得分:0)

就像今天(Java v9.0.4) -