问题标签 [multi-release-jar]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
203 浏览

java - 无法创建 java 9 jar

如果我运行命令jar --create --release 9 -C com.java.mrjar.nine\build\classes .我有错误

这些是 Main 和 TimeUt 类:



我可以在不添加--release 9的情况下正常创建jar,但它是一个普通的 jar,它没有version>9数据。

0 投票
1 回答
1202 浏览

java - 创建多版本 jar 时出错“条目:A.class,包含内部名称为 com.vipin.exp.A 的类,名称不匹配”

这里 java9/com/vipin/exp/A.class 是我想与 jdk 9 和其他版本 java8/com/vipin/exp/A.class 一起使用的文件。为此,我正在尝试创建多版本 jar,但出现以下错误。这个命令有什么问题?

我的目录结构是:

当我只使用一个类文件来创建 jar 时效果很好,如下所示

0 投票
1 回答
407 浏览

java - 在 Java 9 的多版本 JAR 文件中调用了错误的类?

我发现使用多版本 JAR 的 Applet 存在问题,希望有人能帮助我。

我有一个非常简化的多版本 jar 文件,其中包含一个名为 VersionDependent 的类。其方法“version”在Java 9 JRE 系统上运行时应显示“Java 9 版本”,在Java 8 JRE 系统上运行时应显示“Java 8 或更早版本”。

当我通过在运行 Java JRE 9 的客户端机器上的浏览器 (Internet Explorer V11) 中输入此 URL ( http://10.nnn.nn.nn/testLAC.html ) 来运行 Applet 时,一切正常;它按预期显示“Java 9 版本”。

但是,当我通过在同一台客户端计算机上输入此 URL (file:///C:/FOLDER_NAME/testLAC.html) 以在本地查看页面来运行 Applet 时,它意外显示“Java 8 或更早版本”。看起来 Multi-release Jar 的 Java 9 特定 VersionDependent 类没有被调用。有人可以帮我理解为什么多版本 JAR 没有按预期工作吗?客户端机器只安装了 Java JRE 9。

以下是多版本 JAR 文件的内容:

下面是显示 Java JRE 版本然后调用 VersionDependent.version 的测试 Applet 代码:

最后,这是使用测试 Applet JAR 和多版本 JAR 的 HTML 文件:


当我从命令行运行时,会调用正确的 Java 9 类。

新更新:当我在 html 文件上使用 appletviewer 时(在从宽度和高度中取出“%”之后),会调用正确的 Java 9 类。

另一个新更新:一位同事将 Applet 转换为在客户端本地使用 JNLP 文件,并调用了错误的 java 类。但是,当她将本地 JNLP 文件中的代码库字段更改为指向远程服务器时,会从服务器下载资源并调用正确的 Java 9 类。

谁能帮我解决这个问题?我怎样才能更好地解决问题?如果有帮助,我可以发布“工作案例”和“失败案例”的 Java 控制台输出。我已请求在此处创建错误报告:http: //bugreport.java.com
我获得了自动内部审核 ID:9051408

新更新:Oracle 现在可以重现该问题并已创建此问题: https ://bugs.openjdk.java.net/browse/JDK-8191541

以下是 Java 9 和 Java 9 之前的实现VersionDependent

0 投票
0 回答
83 浏览

java - 针对旧版 JDK 的 JPMS/Jigsaw 兼容 Java 库

我试图弄清楚如何使用 Maven 构建与 JDK 7 和 8 兼容的库 jar 文件,但包含一个module-info.java明确声明其公共 API 的文件。

问题:我需要为旧的目标版本进行编译,但旧的 JDK 显然不知道新的 JPMS 功能。

Robert Scholte 的这次演讲中,似乎最好的方法是仅使用 JDK9 编译模块信息文件。但是我如何将它包含到 .jar 中呢?

任何最小的例子pom.xml都会有很大的帮助!:-)

编辑:要清楚一点:我没有收到任何编译器错误。我只是在询问为 JDK 9 用户使用 JPMS 的基本概念,但要让我的库向后兼容 JDK 7 和 8。

0 投票
1 回答
150 浏览

jar - MR-Jars 可以覆盖其他 jar 中的类吗?

我有一个适用于 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,以免被现有的类路径扫描器捕获。

0 投票
1 回答
1565 浏览

java - META-INF/versions/9/* 和 Elasticsearch 6.2.2+ 与 Jetty 9.2 上的字节码扫描错误

使用最新版本的 Elasticsearch(高于 6.1.1)在 Superdev 模式下运行 GWT 应用程序会产生以下错误(见下文)。很明显,这个问题与 Jetty 的过时版本有关。有谁知道如何在 GWT 中替换 Jetty 或更改 IntelliJ 中的配置以使用不同的服务器?在我看来,GWT 文档中的说明写得不好。当然,理想情况下,我希望有一种方法可以直接在 GWT 中更改 Jetty,以便所有项目都可以使用更新后的版本,而不是为每个项目配置自己的服务器。

0 投票
1 回答
2031 浏览

java - gradle 中的 Multi-Release jar

一段时间以来,我一直在摸不着头脑,试图设置我的库以使用多版本 jar 来使用带有备份 java 8 实现的 java 9+ 功能。但是,仅我的项目的一个模块需要它。

我当前的模块 build.gradle 如下所示:

然而,在 intellij 中刷新我的 build.gradle 让我遇到了这个错误: Could not find method java9Implementation() for arguments [file collection] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

我还应该注意这是在 gradle 4.8.1 上。

0 投票
2 回答
822 浏览

java - javadoc 10.0.2 中模块路径上的多版本 log4j-api-2.11.0.jar

我正在尝试包含module-info.javathat的 javadoc 代码requires org.apache.logging.log4j;

我已经包含了来自 Maven Central 的 jar,它与"org.apache.logging.log4j:log4j-api:2.11.0模块路径上的坐标(它是一个多版本 jar)相匹配。

javac编译代码很好,但以下简化javadoc命令输出错误:

错误:

错误:找不到模块:org.apache.logging.log4j 需要 org.apache.logging.log4j;

当我手动重新打包log4j-api-2.11.0.jar为非多版本 jar 时,javadoc工作正常(上面的简化命令输出关于 的错误No public or protected classes found to document,但我的真实命令有效,并且该错误表明简化命令已通过module not found错误)。

javadoc(来自 Oracle JDK 10.0.2+13)是否不支持模块路径上的多版本 jar?

还是有什么问题log4j-api-2.11.0.jar可以修复,同时仍将其作为多版本 jar 进行维护?

0 投票
0 回答
114 浏览

java - jdk10上tomcat8的多发布战争

我刚刚阅读了关于Multi-Release-Jars 的信息,这看起来是一个很好的优势。我无法在 JDK10 上使用 Tomcat8 并没有获得堆栈跟踪。

这是我的 servlet(位于webapp.jar!/META-INF/versions/10/de/NanoNanoServlet.class):

这是我的 servlet(位于webapp.jar!/de/NanoNanoServlet.class):

我得到的是控制台输出:

但它必须是

在 JDK10 上使用 Tomcat

0 投票
0 回答
1635 浏览

java - 无法获取 log4j-api-java9

我正在使用 Java11 构建我的项目,并且我的 pom 看起来像这样,我正在尝试为我的项目获取正确的 log4j-api

log4j-api 从 2.9 开始是一个多版本 jar,支持 java9+ 和更早的 java 版本

在我的项目中,我仍然无法 log4j-api-java9 https://github.com/apache/logging-log4j2/tree/master/log4j-api-java9

我的 pom 看起来像这样

用这个也是没救了