Mar*_*son 13 java applet jar windows-7 java-7
我们有一个相当复杂的签名小程序,自从我们几年前开发它以来一直很好用.在我们关心的所有操作系统/浏览器配置中,它可以在Java 1.5和1.6上运行良好.
它在Windows 7或Vista上的任何浏览器中都不适用于Java 1.7.我们已经看到它适用于Windows XP.此applet在Apache使用mod_proxy连接到Tomcat 6的站点中运行.
这些都是背景信息,因为我将问题简化为一个非常简单的未签名小程序:
package myapplet;
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
public class MyApplet extends Applet {
private static final long serialVersionUID = 1L;
public void paint(Graphics g) {
g.drawRect(0, 0, 250, 100);
g.setColor(Color.blue);
g.drawString("Look at me, I'm a Java Applet!", 10, 50);
}
}
Run Code Online (Sandbox Code Playgroud)
如果将这个applet类放入一个jar文件中,另一个文件将jar文件的总(压缩)大小超过大约18KB,那么当由本地运行的Tomcat 6(或Apache 2.2)提供服务时,applet不会加载.
我通过向jar文件添加文本文件并更改文本文件的大小来玩.我通过在文本文件中添加一个字符来实现它从工作到不工作的程度.
查看带有跟踪的控制台日志,它正在尝试下载jar文件.这是我认为悬挂的主题:
"thread applet-com.bright.assetbank.clientsideedit.myapplet.MyApplet-1" prio=4 tid=0x048d8c00 nid=0x19b8 runnable [0x0700d000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
- locked <0x29fd75b0> (a java.io.BufferedInputStream)
at sun.net.www.MeteredStream.read(Unknown Source)
- locked <0x29fd75d0> (a sun.net.www.http.KeepAliveStream)
at java.io.FilterInputStream.read(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(Unknown Source)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
- locked <0x29fd7630> (a java.io.BufferedInputStream)
at java.io.FilterInputStream.read(Unknown Source)
at sun.plugin.PluginURLJarFileCallBack.downloadJAR(Unknown Source)
at sun.plugin.PluginURLJarFileCallBack.access$000(Unknown Source)
at sun.plugin.PluginURLJarFileCallBack$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin.PluginURLJarFileCallBack.retrieve(Unknown Source)
at sun.net.www.protocol.jar.URLJarFile.retrieve(Unknown Source)
at sun.net.www.protocol.jar.URLJarFile.getJarFile(Unknown Source)
at sun.net.www.protocol.jar.JarFileFactory.get(Unknown Source)
at sun.net.www.protocol.jar.JarURLConnection.connect(Unknown Source)
at sun.plugin.net.protocol.jar.CachedJarURLConnection.connect(Unknown Source)
at sun.plugin.net.protocol.jar.CachedJarURLConnection.getJarFileInternal(Unknown Source)
- locked <0x29f2a938> (a sun.plugin.net.protocol.jar.CachedJarURLConnection)
at sun.plugin.net.protocol.jar.CachedJarURLConnection.getJarFile(Unknown Source)
- locked <0x29f2a938> (a sun.plugin.net.protocol.jar.CachedJarURLConnection)
at com.sun.deploy.security.DeployURLClassPath$JarLoader.getJarFile(Unknown Source)
at com.sun.deploy.security.DeployURLClassPath$JarLoader.access$1000(Unknown Source)
at com.sun.deploy.security.DeployURLClassPath$JarLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.deploy.security.DeployURLClassPath$JarLoader.ensureOpen(Unknown Source)
at com.sun.deploy.security.DeployURLClassPath$JarLoader.<init>(Unknown Source)
at com.sun.deploy.security.DeployURLClassPath$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.deploy.security.DeployURLClassPath.getLoader(Unknown Source)
at com.sun.deploy.security.DeployURLClassPath.getLoader(Unknown Source)
- locked <0x29dc7e98> (a com.sun.deploy.security.DeployURLClassPath)
at com.sun.deploy.security.DeployURLClassPath.getResource(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin2.applet.Plugin2ClassLoader.findClassHelper(Unknown Source)
at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
- locked <0x29dc7ed8> (a sun.plugin2.applet.Applet2ClassLoader)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
- locked <0x29dc7f78> (a sun.plugin2.applet.Applet2ClassLoader)
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
- locked <0x29dc7f78> (a sun.plugin2.applet.Applet2ClassLoader)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unknown Source)
at sun.plugin2.applet.Plugin2Manager.initAppletAdapter(Unknown Source)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
以下是Java控制台中的最后4行:
network: Cache entry not found [url: http://localhost/editor.jar, version: null]
network: Connecting http://localhost/editor.jar with proxy=DIRECT
network: Connecting http://localhost:80/ with proxy=DIRECT
network: Connecting http://localhost/editor.jar with cookie "csrftoken=523154b2e73a76b6f2088464bd4df4f7"
Run Code Online (Sandbox Code Playgroud)
一些其他信息:
尝试加载在Windows 7或Vista上的浏览器中运行Java 7的applet时,有没有其他人看到这种行为?有解决方案吗?
有关如何重现此问题的分步说明:
例如:
<html>
<body>
<applet code="myapplet.MyApplet" name="MyApplet" width="300" height="300" archive= "editor.jar" ></applet>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
Java bug 数据库中bug 7183450的解决方法修复了此问题,即添加
-Djava.net.preferIPv4Stack=true
Run Code Online (Sandbox Code Playgroud)
到 JVM 参数。
例如,要运行我的测试小程序(请参阅上面问题中的示例):
<html>
<body>
<applet code="myapplet.MyApplet" name="MyApplet" width="300" height="300" archive= "editor.jar" >
<param name="java_arguments" value="-Djava.net.preferIPv4Stack=true">
</applet>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
这可能是因为托管我们的小程序的远程服务器当前不允许 IPv6 通信通过其防火墙。
有趣的是,我们的一些 Windows 7 机器在运行 Java 1.7_05 时即使使用此解决方法仍然无法工作,但在升级到 Java 1.7_06(现已可用)时却可以(使用此解决方法)工作。