【发布时间】:2023-03-02 22:17:01
【问题描述】:
我们有一个相当复杂的签名小程序,自从我们几年前开发它以来,它一直运行良好。它可以在我们关心的所有操作系统/浏览器配置上与 Java 1.5 和 1.6 一起正常运行。
它不适用于 Windows 7 或 Vista 上的任何浏览器中的 Java 1.7。我们已经看到它可以在 Windows XP 上运行。该小程序在由 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);
}
}
如果将此小程序类放入一个 jar 文件中,而另一个文件的 jar 文件的总(压缩)大小超过约 18KB,则当由本地运行的 Tomcat 6(或 Apache 2.2)提供服务时,该小程序不会加载.
我在 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)
这是 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"
一些附加信息:
- 在浏览器中运行 Java 7 的 Windows Vista 上,如果我取消选中“启用黑名单撤销检查”,我们的主小程序(由 Apache->mod_proxy->tomcat 提供服务)会加载。如果选中此项,则不会加载。取消选中此项在 Windows 7 上无效(即无法正常工作)。
- 我尝试将我的测试小程序托管在 Tomcat(本地)、Apache(本地)和 Apache(我通过 Internet 访问的远程服务器上)。对于每一个,都有一个 jar 文件的大小,超过该大小的小程序将无法加载 - 但是,这个大小因 Web 服务器而异。例如,在远程服务器上,jar 文件可能要大得多——它必须超过 1MB 才能加载。
在尝试加载在 Windows 7 或 Vista 上的浏览器中运行 Java 7 的小程序时,有没有其他人看到过这种行为?有解决办法吗?
如何重现此问题的分步说明:
- 将上面的代码复制到名为 MyApplet.java 的文件中,该文件位于 名为 myapplet 的目录
- 编译代码,即javac MyApplet.java
- 创建一个jar文件:cd到myapplet的父目录并输入jar -cvf editor.jar myapplet
- 创建一个简单的 HTML 页面来显示小程序。
例如:
<html>
<body>
<applet code="myapplet.MyApplet" name="MyApplet" width="300" height="300" archive= "editor.jar" ></applet>
</body>
</html>
- 将此 HTML 文件和 jar 文件放入同一目录并从 Web 服务器提供服务,例如Apache 或 Tomcat。
- 在 Windows 7 操作系统的 Chrome 或 IE 中访问此 HTML 页面。小程序可以正常加载!
- 重复上述步骤,但这次放一个小文件,例如在创建 jar 文件之前,将图像(例如
- 重复,但这次在创建 jar 文件之前将一个大图像(例如 >100KB)放入 myapplet 目录(MyApplet.class 旁边)。 jar 文件现在会很大。这不起作用,即无法加载小程序。如果是这样,并且您使用的是 Windows 7,请告诉我。测试时,不要忘记小程序是缓存的,所以在 java 控制台中按 x 键刷新类加载器缓存,按 f5 刷新浏览器。
【问题讨论】:
-
这似乎使它与大小有关。你从什么下载?您可以在这里发布相关的 Java 控制台输出吗?我有一个更大的小程序,可以在 Java 7 上正常工作。
-
但是,如果您在主 jar 文件中包含目录,您的小程序是否可以在 Windows 7 上运行?
-
您进行测试的机器上是否安装了任何防病毒程序?尝试停用这些,如果可能的话,还可以停用 Windows 7/vista 自己的安全功能(UAC、防火墙等),看看它是否可以这样工作。
-
尝试手动下载 jar 并验证它是否完好无损。运行 SHA1/MD5 校验和以验证它是否未更改。
-
如果您使用本地 html 文件从浏览器运行此小程序而不是从服务器下载它,它的行为是否相同?
标签: java windows-7 jar applet java-7