7

我发现使用多版本 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"; 
  } 
}
4

1 回答 1

2

Oracle 现在可以在 JDK 9/9.0.1 下重现该问题,并在#JDK-8191541下创建了此问题,可以在其中跟踪当前更新。

更新:JDK-8191541 已被标记为#JDK-8192748的副本,并将在 JDK10 中修复(计划于 2018 年 3 月发布)。

我问过甲骨文他们是否计划将修复移植到 JDK9。

2018 年 1 月 29 日更新:甲骨文报告说他们不会将修复移植到 JDK9。

更新:2018 年 1 月 29 日:Oracle 向我指出了 JDK 10 的早期版本,它应该有修复:http: //jdk.java.net/10/ 不幸的是,当我尝试相同的多版本 JAR 时用 Java JDK 10 EA 测试,问题依然存在。我正在创建另一个错误条目,这次是针对 JDK 10 EA。

如果/当有解决方案或解决方法时,我将发布另一个更新。

于 2017-11-22T12:16:13.363 回答