我发现使用多版本JAR的Applet存在问题,我希望有人可以帮助我.

我有一个非常简化的多版本jar文件,其中有一个名为VersionDependent的类.它的方法“版本”应该显示
在Java 9 JRE系统上运行时的“Java 9版本”,并在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,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",70);
    } else {
        String a = "VersionDependent.version is not null. Output: " + test;
        g.drawString(a,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/
不幸的是,当我使用Java JDK 10 EA尝试相同的多版本JAR测试时,问题仍然存在.我正在创建另一个错误条目,这次是针对JDK 10 EA.

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

在Java 9上的多版本JAR文件中调用了错误的类?的更多相关文章

  1. Servlet服务端实现原理详解

    Servlet是Sun公司开发动态web的一门技术,Sun公司在这些API中提供了一个接口叫做:Servlet,如果想开发一个Servlet程序,只需要完成两个小步骤:编写一个类,实现Servlet接口、把开发好的Java类部署到web服务器中。但是你了解Servlet实现的原理吗

  2. 如果jar文件&gt;一定大小,Applet无法在Windows 7上加载Java 1.7

    我们有一个相当复杂的签名小程序,自从我们几年前开发以来,我们一直在为我们工作.在我们关心的所有操作系统/浏览器配置上,Java1.5和1.6都可以正常运行.在Windows7或Vista上的任何浏览器中,它不适用于Java1.7.我们已经看到它在WindowsXP上工作.该小程序正在Apache使用mod_proxy连接到Tomcat6的站点中运行.这些都是为了背景信息,因为我将问题减少到一个非常

  3. 问题解决

    本博文将长期更新,用于记录Ubuntu下各种问题的解决办法。

  4. Angular.js和Java Applet

    我试图使用Angular.js通过applet调用java函数但没有成功.我甚至没有加载Applet.我使用了以下方法但没有成功.有任何想法吗?

  5. java – 在Swing GUI中嵌入第三方JApplet并传递参数

    我想在Swing应用程序中嵌入第三方applet.基本上,我希望它只是另一个小组.该applet使用许多参数,例如我已经看到很多关于如何通过HTML发送参数值的文档,但是你如何通过代码来做呢?任何帮助,将不胜感激!解决方法实现AppletStub&将其设置为applet实例的存根.例如.典型的I/O.

  6. 在Java 9上的多版本JAR文件中调用了错误的类?

    我怎样才能更好地排除问题?

  7. Java9多模块Maven项目测试依赖项

    出于显而易见的原因,我不希望我的主代码引入测试依赖项.我错过了什么吗?

  8. 如何等待Java applet在Safari上完成加载?

    谢谢PS:我不确定它是否相关,但JAR已签署.解决方法我使用一个计时器,在它放弃之前重置并保持多次检查.请注意,这假定applet将在Safari中运行.我有一些实例,其中一个applet需要Java6,即使使用与上面类似的代码,也只需挂起Safari.我选择在服务器上进行浏览器检测,并在浏览器不支持applet时将用户重定向到错误页面.

  9. java – 如果applet在浏览器的JRE中运行,为什么机器上需要JRE?

    小程序在浏览器的JRE中运行.这是否意味着您不必在您的计算机上安装JRE以运行applet?解决方法“浏览器的JVM”是您在计算机上安装的JRE.浏览器通常不带有自己的浏览器,它们只使用您已经安装在系统上的任何内容.也许你把Java与JavaScript混淆了,这些JavaScript实际上是完全无关的.

  10. java FX applet和java applet有什么区别?

    javaFXapplet比传统的javaapplet更快吗?解决方法据我所知,没有任何东西叫做JavaFXApplet.我们只是使用Applet在浏览器中运行我们的JavaFX程序.换句话说,我们可以将JavaFX程序作为Applet导出到Web.此外,JavaFX和Applet不是互斥的,请查看here和here.一个可能清除混乱的SOthreadfound.

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部