![](/img/trans.png)
[英]Error: log4j-api-2.9.0.jar is a multi-release jar file but --multi-release option is not set
[英]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.