我发现使用多版本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) 使用最新版本的 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) 我知道module_info.java被jdk9 +识别
我不知道module-info.java是否仍然可以与目标等级8结合使用.
例如,我希望我的库在java9 +项目中使用,它将把它识别为导出特定包的模块,但也可以在java8项目中用作普通的jar文件.
java java-platform-module-system java-9 module-info multi-release-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
目录中的长路径名)
为了使这项工作顺利进行,我们需要做一些特别的事情吗?我会接受以下任何内容:
META-INF/versions/9
类META-INF/versions/9
使用第三方 .jar 中存在的类。我对涉及每次构建 .war 时手动删除 .war 中的任何内容的答案不感兴趣。另外,我不确定此时是否可以降级到早期版本的第 3 方 .jar。Log4j2,可能可以......但还有其他。
谢谢!
我的 lambda 在 Java8 下运行了几年,我刚刚将其更新到 Java 11。它立即崩溃了,给了我这样的错误:
\nCaused 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所讨论的类并不是特别令人兴奋,并且具有在我的类中常见的简单静态初始化:
\npublic 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 ×5
java-9 ×2
aws-lambda ×1
jar ×1
java-platform-module-system ×1
jetty ×1
log4j2 ×1
maven ×1
module-info ×1
weblogic ×1
weblogic12c ×1