2017-10-23 23 views
7

Tôi đang gặp sự cố với một Applet bằng cách sử dụng một JAR đa phát hành, mà tôi hy vọng ai đó có thể giúp tôi.Lớp sai được gọi trong tệp JAR đa phát hành trên Java 9?

Tôi có tệp jar nhiều bản phát hành rất đơn giản với một lớp có tên VersionDependent. Phương thức "phiên bản" của nó sẽ hiển thị "phiên bản Java 9" khi chạy trên hệ thống Java JRE 9 và hiển thị "Java 8 hoặc phiên bản cũ hơn" khi chạy trên hệ thống Java 8 JRE.

Khi tôi chạy Applet bằng cách nhập URL này (http://10.nnn.nn.nn/testLAC.html) vào trình duyệt của tôi (Internet Explorer V11) trên máy khách chạy Java JRE 9, mọi thứ hoạt động chính xác; nó hiển thị "phiên bản Java 9" như mong đợi.

Nhưng khi tôi chạy Applet bằng cách nhập URL này (tệp: /// C: /FOLDER_NAME/testLAC.html) trên cùng một máy khách để xem trang cục bộ, nó hiển thị bất ngờ "Java 8 hoặc phiên bản cũ hơn" . Có vẻ như lớp Java VersionDependent cụ thể 9 của Jar đa phát hành không được gọi. Ai đó có thể giúp tôi hiểu tại sao JAR đa phát hành không hoạt động như mong đợi? Máy khách chỉ cài đặt Java JRE 9.

Dưới đây là nội dung của đa phát hành tập tin 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 

Đây là mã kiểm tra Applet hiển thị phiên bản Java JRE và sau đó các cuộc gọi vào 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() { } 
} 

Cuối cùng, đây là tệp HTML sử dụng JAR Applet thử nghiệm và JAR đa phát hành:

<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> 

Khi tôi chạy từ dòng lệnh, lớp Java 9 thích hợp được gọi.

cập nhật mới: Khi tôi sử dụng appletviewer vào file html (sau khi ra trường "%" từ chiều rộng và chiều cao), các hợp lớp Java 9 được gọi.

Một bản cập nhật mới: Một đồng nghiệp chuyển đổi các Applet để sử dụng một file JNLP cục bộ trên máy khách, và lớp java sai được gọi. Nhưng khi cô thay đổi trường codebase trong tệp JNLP cục bộ để trỏ đến máy chủ từ xa, các tài nguyên đã được tải xuống từ máy chủ và lớp Java 9 thích hợp đã được gọi.

Có ai có thể giúp tôi giải quyết vấn đề này không? Làm thế nào tôi có thể khắc phục sự cố tốt hơn? Tôi có thể đăng đầu ra giao diện điều khiển Java cho "trường hợp làm việc" và "trường hợp không thành công" nếu điều đó có thể hữu ích. Tôi đã yêu cầu tạo báo cáo lỗi tại đây: http://bugreport.java.com.
tôi đã đưa ra một tự động ID đánh giá nội bộ: 9051408

cập nhật mới: Oracle bây giờ có thể tạo lại vấn đề và đã tạo ra vấn đề này: https://bugs.openjdk.java.net/browse/JDK-8191541

Và đây là Java 9 và triển khai trước Java 9 của 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"; 
    } 
} 
+0

Việc triển khai 'VersionDependent' là gì? và hành vi của bạn là gì nếu bạn cố gắng truy cập các lọ này trên dòng lệnh với các phiên bản java khác nhau? – nullpointer

+0

Xin lỗi về điều đó, tôi đã chuyển thông tin cho câu hỏi. –

+0

Nó luôn luôn trông giống như một cái gì đó không chính xác. Đề xuất bạn trả lời cập nhật hiện tại. Trừ khi điều này được giải quyết tất nhiên. – nullpointer

Trả lời

2

Oracle hiện có thể tái tạo e vấn đề theo JDK 9/9.0.1 và đã tạo sự cố này theo #JDK-8191541 nơi có thể theo dõi các bản cập nhật hiện tại.

Cập nhật: JDK-8191541 đã được đánh dấu là bản sao của #JDK-8192748 và sẽ được sửa trong JDK10 (dự kiến ​​phát hành vào tháng 3 năm 2018).

Tôi đã hỏi Oracle liệu họ có dự định quay lại việc sửa chữa JDK9 hay không.

Cập nhật 1/29/2018: Oracle thông báo rằng họ sẽ KHÔNG quay lại việc sửa lỗi cho JDK9.

Cập nhật: 2018/01/29: Oracle đã chỉ cho tôi để được thả sớm của JDK 10, được cho là có sửa chữa: http://jdk.java.net/10/ Thật không may, khi tôi thử kiểm tra JAR Multi-phát hành cùng với Java JDK 10 EA, vấn đề vẫn còn. Tôi đang tạo một mục lỗi khác, lần này chống lại JDK 10 EA.

Tôi sẽ đăng bản cập nhật khác nếu/khi có giải pháp hoặc giải pháp thay thế.

Các vấn đề liên quan