我发现使用多版本 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 文件的内容:
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
下面是显示 Java JRE 版本然后调用 VersionDependent.version 的测试 Applet 代码:
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, 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",10,70);
} else {
String a = "VersionDependent.version is not null. Output: " + test;
g.drawString(a,10,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 文件中的代码库字段更改为指向远程服务器时,会从服务器下载资源并调用正确的 Java 9 类。
谁能帮我解决这个问题?我怎样才能更好地解决问题?如果有帮助,我可以发布“工作案例”和“失败案例”的 Java 控制台输出。我已请求在此处创建错误报告:http: //bugreport.java.com。
我获得了自动内部审核 ID:9051408
新更新:Oracle 现在可以重现该问题并已创建此问题: https ://bugs.openjdk.java.net/browse/JDK-8191541
以下是 Java 9 和 Java 9 之前的实现VersionDependent
:
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";
}
}