簡體   English   中英

在Java 9上的多版本JAR文件中調用了錯誤的類?

[英]Wrong class invoked in Multi-release JAR file on Java 9?

我發現使用多版本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 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, 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文件中的codebase字段更改為指向遠程服務器時,資源從服務器下載並調用了正確的Java 9類。

任何人都可以幫我解決這個問題嗎? 我怎樣才能更好地排除問題? 我可以發布Java控制台輸出的“工作案例”和“失敗的案例”,如果這將有所幫助。 我已經請求在這里創建一個錯誤報告: http//bugreport.java.com
我得到了一個自動內部審查ID:9051408

新的更新:Oracle現在可以重現該問題並創建了此問題: https//bugs.openjdk.java.net/browse/JDK-8191541

以下是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的早期版本,它應該有修復: http//jdk.java.net/10/不幸的是,當我嘗試使用相同的多版本JAR時使用Java JDK 10 EA進行測試,問題仍然存在。 我正在創建另一個錯誤條目,這次是針對JDK 10 EA。

如果/當有解決方案或解決方法時,我會發布另一個更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM