问题标签 [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.
java - 无法创建 java 9 jar
如果我运行命令jar --create --release 9 -C com.java.mrjar.nine\build\classes .
我有错误
这些是 Main 和 TimeUt 类:
我可以在不添加--release 9的情况下正常创建jar,但它是一个普通的 jar,它没有version>9数据。
java - 创建多版本 jar 时出错“条目:A.class,包含内部名称为 com.vipin.exp.A 的类,名称不匹配”
这里 java9/com/vipin/exp/A.class 是我想与 jdk 9 和其他版本 java8/com/vipin/exp/A.class 一起使用的文件。为此,我正在尝试创建多版本 jar,但出现以下错误。这个命令有什么问题?
我的目录结构是:
当我只使用一个类文件来创建 jar 时效果很好,如下所示
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
:
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。
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 个单独的罐子有两个原因:
- 尝试制作适用于 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
,以免被现有的类路径扫描器捕获。
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,以便所有项目都可以使用更新后的版本,而不是为每个项目配置自己的服务器。
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 上。
java - javadoc 10.0.2 中模块路径上的多版本 log4j-api-2.11.0.jar
我正在尝试包含module-info.java
that的 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 进行维护?
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
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 看起来像这样
用这个也是没救了