13

かなり複雑な署名付きアプレットがあり、数年前に開発して以来、正常に機能しています。気になるすべてのOS/ブラウザ構成でJava1.5および1.6で正常に動作します。

Windows7またはVistaのどのブラウザのJava1.7でも動作しません。WindowsXPで動作することを確認しました。このアプレットは、mod_proxyを使用してTomcat6に接続するApacheによって提供されるサイトで実行されています。

問題を非常に単純な署名されていないアプレットに減らしたので、背景情報は以上です。

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ファイルの合計(圧縮)サイズが約18KBを超える別のファイルとともにjarファイルに入れられた場合、ローカルで実行されているTomcat 6(またはApache 2.2)によって提供されると、アプレットはロードされません。

jarファイルにテキストファイルを追加し、テキストファイルのサイズを変更して遊んでみました。テキストファイルに1文字追加することで、機能する状態から機能しない状態に移行するまでになりました。

トレースがオンになっているコンソールログを見ると、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"

いくつかの追加情報:

  • ブラウザでJava7を実行しているWindowsVistaで、[ブラックリスト失効チェックを有効にする]をオフにすると、メインアプレット(Apache-> mod_proxy-> tomcatによって提供)がロードされます。これをチェックするとロードされません。これをオフにしても、Windows 7では効果がありません(つまり、機能しません)。
  • テストアプレットをTomcat(ローカル)、Apache(ローカル)、Apache(インターネット経由でアクセスするリモートサーバー上)でホストしてみました。それぞれについて、アプレットがロードされないサイズのjarファイルがありましたが、このサイズはWebサーバー間で異なりました。たとえば、リモートサーバーでは、jarファイルがはるかに大きくなる可能性があります。ロードされないようにするには、1MBを超える必要がありました。

Windows7またはVistaのブラウザで実行されているJava7でアプレットをロードしようとしたときに、他の誰かがこの動作を見たことがありますか?解決策はありますか?

この問題を再現する方法のステップバイステップの説明:

  • 上記のコードを、myappletというディレクトリにあるMyApplet.javaというファイルにコピーします。
  • コードをコンパイルします。つまり、javac MyApplet.java
  • jarファイルを作成します。myappletの親ディレクトリにcdして、jar-cvfeditor.jarmyappletと入力します。
  • アプレットを表示するための単純なHTMLページを作成します。

例えば:

<html>  
    <body>
        <applet code="myapplet.MyApplet" name="MyApplet" width="300" height="300" archive= "editor.jar" ></applet>
    </body>
</html>
  • このHTMLファイルとjarファイルを同じディレクトリに配置し、ApacheやTomcatなどのWebサーバーから提供します。
  • ChromeまたはWindows7OSのIEでこのHTMLページにアクセスします。アプレットは正常にロードされます。
  • 上記の手順を繰り返しますが、今回は、jarファイルを作成する前に、画像などの小さなファイル(<2KBなど)をmyappletディレクトリ(MyApplet.classの隣)に配置します。これも機能するはずです。
  • 繰り返しますが、今回はjarファイルを作成する前に大きな画像(例:> 100KB)をmyappletディレクトリ(MyApplet.classの隣)に配置します。jarファイルはかなり大きくなります。これは機能しません。つまり、アプレットはロードされません。もしそうなら、そしてあなたがWindows 7を使用しているなら、私に知らせてください。テスト中は、アプレットがキャッシュされることを忘れないでください。Javaコンソールのxキーを押してクラスローダーのキャッシュを更新し、f5を押してブラウザを更新します。
4

1 に答える 1

2

Javaバグデータベースのバグ7183450の回避策は、この問題を修正します。

-Djava.net.preferIPv4Stack=true 

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>

これはおそらく、アプレットをホストしているリモートサーバーが現在IPv6通信をファイアウォールを通過させていないためです。

興味深いことに、一部のWindows 7マシンは、Java 1.7_05を実行しているときはこの回避策を使用しても機能しませんでしたが、Java 1.7_06(現在利用可能)にアップグレードすると(この回避策を使用して)機能しました。

于 2012-08-19T19:11:55.100 に答える