0

2 つの署名付き jar を参照するアプレットがあります。

  • myapplet.jar
  • jackson-all-1.9.9.jar

アプレットを 2 回目に起動すると (1 回目はエラーなし)、次のようになります。

Exception in thread "thread applet-main.MyApplet-1"
java.lang.ExceptionInInitializerError
              at org.codehaus.jackson.map.deser.StdDeserializerProvider.<init>(StdDeserializerProvider.java:81)
              at org.codehaus.jackson.map.ObjectMapper.<init>(ObjectMapper.java:398)
              at org.codehaus.jackson.map.ObjectMapper.<init>(ObjectMapper.java:358)
              at org.codehaus.jackson.map.ObjectMapper.<init>(ObjectMapper.java:328)
              at net.Remote.<init>(Remote.java:50)
              at main.Env.init(Env.java:44)
              at main.MyApplet.init(MyApplet.java:25)
              at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
              at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.SecurityException: Prohibited package name: java.util
              at java.lang.ClassLoader.preDefineClass(Unknown Source)
              at java.lang.ClassLoader.defineClassCond(Unknown Source)
              at java.lang.ClassLoader.defineClass(Unknown Source)
              at java.security.SecureClassLoader.defineClass(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)
              at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
              at java.lang.ClassLoader.loadClass(Unknown Source)
              at java.lang.Class.forName0(Native Method)
              at java.lang.Class.forName(Unknown Source)
              at org.codehaus.jackson.map.deser.BasicDeserializerFactory.<clinit>(BasicDeserializerFactory.java:74)
              ... 9 more

問題の行は、次の try-catch ブロックの最初の行です。

try {
    Class<?> key = Class.forName("java.util.ConcurrentNavigableMap");
    Class<?> value = Class.forName("java.util.ConcurrentSkipListMap");
    @SuppressWarnings("unchecked")
        Class<? extends Map<?,?>> mapValue = (Class<? extends Map<?,?>>) value;
    _mapFallbacks.put(key.getName(), mapValue);
} catch (ClassNotFoundException cnfe) { // occurs on 1.5
}

私が理解していないいくつかのこと:

  • Java7 JVM がそれをランタイム ライブラリから取り出さないのはなぜですか? むしろ
  • サーバーからダウンロードしようとする/java/util/ConcurrentNavigableMap.classのはなぜ404ですか?
  • それが失敗するのに、25 回連続して再ダウンロードを試みmyapplet.jar、毎回成功し ( 200)、毎回同じ jar ファイルを返すのはなぜですか?

更新25 回の再試行がクラス ローダーがクラスをロードしようとしていることが原因であるかどうかはわかりません。リソースをロードしようとしている他のコードである可能性があります (これはまだ奇妙ですが、CurrentNavigableMap問題とは関係ありません)。私の質問からそれを除外します。

cache_archive注意: Jackson jar ファイルは属性にリストされているため、再ダウンロードしようとはしないと思います。

4

1 に答える 1

2

これは?

違う:

Class.forName("java.util.ConcurrentNavigableMap");

正しい:
http://java.sun.com/javase/ja/6/docs/ja/api/java/util/concurrent/package-tree.html

Class.forName("java.util.concurrent.ConcurrentNavigableMap");
于 2012-09-10T13:07:45.293 に答える