标签: multi-release-jar

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

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

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

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

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

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

jar tvf mr.jar | more
  0 Mon Oct 23 08:52:38 EDT 2017 META-INF/
 82 Mon Oct 23 08:52:38 EDT 2017 META-INF/MANIFEST.MF           (This has Multi-Release: true  !)
  0 Thu Jun 08 07:58:28 EDT 2017 com/
  0 Thu Jun 08 07:58:28 EDT 2017 com/emc/
  0 Mon Oct 23 08:50:40 EDT 2017 com/emc/demo/
324 Mon Oct 23 …
Run Code Online (Sandbox Code Playgroud)

java jar java-9 multi-release-jar

7
推荐指数
1
解决办法
243
查看次数

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

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

2018-06-20 16:17:13.923:INFO:oejs.Server:main: jetty-9.2.z-SNAPSHOT
Starting Jetty on port 8888
   [WARN] Failed startup of context c.g.g.d.s.j.WebAppContextWithReload@39f6694a{/,file:/Users/../Library/Caches/IntelliJIdea2018.1/gwt/....86a74491/....92536ba7/run/www/,STARTING}{/Users/../Library/Caches/IntelliJIdea2018.1/gwt/....86a74491/....92536ba7/run/www}
MultiException[java.lang.RuntimeException: Error scanning entry META-INF/versions/9/org/elasticsearch/core/internal/io/Streams.class from jar file:/Users/../Library/Caches/IntelliJIdea2018.1/gwt/.86a74491/.92536ba7/run/www/WEB-INF/lib/elasticsearch-core-6.3.0.jar, java.lang.RuntimeException: Error scanning entry META-INF/versions/9/org/elasticsearch/monitor/jvm/JvmPid.class from jar file:/Users/../Library/Caches/IntelliJIdea2018.1/gwt/...86a74491/.92536ba7/run/www/WEB-INF/lib/elasticsearch-6.3.0.jar]
    at org.eclipse.jetty.annotations.AnnotationConfiguration.scanForAnnotations(AnnotationConfiguration.java:536)
    at org.eclipse.jetty.annotations.AnnotationConfiguration.configure(AnnotationConfiguration.java:447)
    at org.eclipse.jetty.webapp.WebAppContext.configure(WebAppContext.java:479)
Run Code Online (Sandbox Code Playgroud)

java jetty elasticsearch multi-release-jar

5
推荐指数
1
解决办法
1384
查看次数

如果目标级别为8,我可以使用module-info.java吗?

我知道module_info.java被jdk9 +识别

我不知道module-info.java是否仍然可以与目标等级8结合使用.

例如,我希望我的库在java9 +项目中使用,它将把它识别为导出特定包的模块,但也可以在java8项目中用作普通的jar文件.

java java-platform-module-system java-9 module-info multi-release-jar

5
推荐指数
1
解决办法
206
查看次数

在 Oracle WebLogic Server 上部署多个版本 .jar

我们正在尝试将 Web 服务(.war 文件)部署到 Oracle WebLogic 12.2.1.0.0 服务器上。

例如,.war 包含一些第三方 .jar,log4j-api-2.12.0.jar它们是多个版本的 .jar(根据 JEP 238,包含Multi-Release: true在 MANIFEST.MF 中)。

因此,它在META-INF/versions/9目录中包含一些 Java 9 编译的类。WebLogic 12.2 仅使用 Java 8(通过 WebLogic 管理控制台确认版本为 Java 1.8.0_92)。

据我了解,Java 8 服务器应该不会看到/忽略META-INF/versions目录下的任何类,但这似乎并没有发生。看起来 Oracle WLS 只是扫描整个 .war。

结果,当我们尝试部署 .war 时,我们会收到如下错误:

BEA-160248 无法解析类文件:...(然后是META-INF/versions/9目录中的长路径名)

为了使这项工作顺利进行,我们需要做一些特别的事情吗?我会接受以下任何内容:

  • 以某种方式配置 WLS 以忽略这些META-INF/versions/9
  • 配置 Maven 以某种方式构建 .war,而不META-INF/versions/9使用第三方 .jar 中存在的类。

我对涉及每次构建 .war 时手动删除 .war 中的任何内容的答案不感兴趣。另外,我不确定此时是否可以降级到早期版本的第 3 方 .jar。Log4j2,可能可以......但还有其他。

谢谢!

java weblogic maven weblogic12c multi-release-jar

5
推荐指数
1
解决办法
4576
查看次数

AWS Lambda 使用多版本 JAR 中的错​​误类文件?

我的 lambda 在 Java8 下运行了几年,我刚刚将其更新到 Java 11。它立即崩溃了,给了我这样的错误:

\n
Caused by: java.lang.ExceptionInInitializerError\n    at com.mycompany.rest.providers.JsonProvider.writeTo(JsonProvider.java:80)\n    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:242)\n    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:227)\n    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:139)\n    at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1116)\n    at org.glassfish.jersey.client.ClientRequest.doWriteEntity(ClientRequest.java:461)\n    at org.glassfish.jersey.client.ClientRequest.writeEntity(ClientRequest.java:443)\n    at org.glassfish.jersey.client.internal.HttpUrlConnector._apply(HttpUrlConnector.java:367)\n    at org.glassfish.jersey.client.internal.HttpUrlConnector.apply(HttpUrlConnector.java:265)\n    at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:297)\n    ... 15 more\nCaused by: java.lang.UnsupportedOperationException: No class provided, and an appropriate one cannot be found.\n    at org.apache.logging.log4j.LogManager.callerClass(LogManager.java:571)\n    at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:596)\n    at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:583)\n    at com.mycompany.rest.util.NonClosingOutputStream.<clinit>(NonClosingOutputStream.java:11)\n    ... 25 more\n
Run Code Online (Sandbox Code Playgroud)\n

所讨论的类并不是特别令人兴奋,并且具有在我的类中常见的简单静态初始化:

\n
public class NonClosingOutputStream extends ProxyOutputStream {\n    private static final Logger log = LogManager.getLogger(); // Line 11\n\n    public NonClosingOutputStream(final OutputStream proxy) …
Run Code Online (Sandbox Code Playgroud)

java log4j2 aws-lambda multi-release-jar

1
推荐指数
1
解决办法
2860
查看次数