在Java 9上的多版本JAR文件中调用了错误的类?
我发现使用多版本JAR的Applet存在问题,我希望有人可以帮助我.
我有一个非常简化的多版本jar文件,其中有一个名为VersionDependent的类.它的方法“版本”应该显示 当我通过在运行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 08:43:44 EDT 2017 com/emc/demo/VersionDependent.class 0 Thu Jun 08 07:58:28 EDT 2017 META-INF/versions/9/ 0 Thu Jun 08 07:58:28 EDT 2017 META-INF/versions/9/com/ 0 Thu Jun 08 07:58:28 EDT 2017 META-INF/versions/9/com/emc/ 0 Thu Jun 08 08:24:32 EDT 2017 META-INF/versions/9/com/emc/demo/ 313 Mon Oct 23 08:47:34 EDT 2017 META-INF/versions/9/com/emc/demo/VersionDependent.class 下面是测试Applet代码,它显示Java JRE的版本,然后调用VersionDependent.version: package appletExample; //Reference the required Java libraries import java.applet.Applet; import java.awt.*; import com.emc.demo.VersionDependent; //The applet code public class TestAppletLAC extends Applet { private Button button1; public void paint(Graphics g) { // Draw a rectangle width=250,height=100 g.drawRect(0,500,100); // Set the color to blue g.setColor(Color.blue); g.drawString("Major version: " + System.getProperty("java.version"),10,50); String test = new VersionDependent().version(); if(test == null){ g.drawString("VersionDependent.version is null",70); } else { String a = "VersionDependent.version is not null. Output: " + test; g.drawString(a,90); } } public void init() { } } 最后,这是使用测试Applet JAR和多版本JAR的HTML文件: <HTML> <HEAD> <TITLE></TITLE> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /> </HEAD> <BODY topmargin="0" leftmargin="0" marginwidth="0" marginheight="0"> <applet codebase="." mayscript="true" width="100%" height="100%" codebase_lookup="false" START_BACKGROUND="65A0EA" END_BACKGROUND="2F63AC" code="appletExample.TestAppletLAC" archive="mr.jar,testAppletLAC.jar" name="FxApplet"> <param name="separate_jvm" value="true"/><param name="java_arguments" value="-Djnlp.packEnabled=false"/><param name="codebase_lookup" value="false"/> </applet> </HTML> 当我从命令行运行时,调用适当的Java 9类. 新更新:当我在html文件上使用appletviewer时(从宽度和高度取出“%”之后),调用适当的Java 9类. 另一个新的更新:一个同事将Applet转换为在客户端本地使用JNLP文件,并调用了错误的java类.但是,当她将本地JNLP文件中的codebase字段更改为指向远程服务器时,资源从服务器下载并调用了正确的Java 9类. 任何人都可以帮我解决这个问题吗?我怎样才能更好地排除问题?如果有帮助,我可以发布“工作案例”和“失败案例”的Java控制台输出.我已经要求在这里创建一个错误报告:http://bugreport.java.com. 新更新:Oracle现在可以重现该问题并创建了此问题: 以下是VersionDependent的Java 9和Java 9之前的实现: package com.emc.demo; /** * This is the Java 9 version of the class `VersionDependent`. */ public class VersionDependent { public String version() { return "Java 9 version"; } } package com.emc.demo; /** * This is the pre Java 9 version of the class `VersionDependent`. */ public class VersionDependent { public String version() { return "Java 8 or earlier version"; } } 解决方法
Oracle现在可以在JDK 9 / 9.0.1下重现该问题,并在
#JDK-8191541下创建了此问题,可以在其中跟踪当前更新.
更新:JDK-8191541已被标记为#JDK-8192748的副本,将在JDK10中修复(计划于2018年3月发布). 我问他们是否计划将修复程序移植到JDK9. 更新1/29/2018:Oracle报告他们不会将修复程序移植回JDK9. 更新:1/29/2018:Oracle向我指出JDK 10的早期版本,它应该有修复: 如果/当有解决方案或解决方法时,我将发布另一个更新. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |