2

私はサンドボックス化されたアプレットを持っていますが、それは違いを生まないはずです。

アプレットは2つのjarファイルで構成されています。同じdomain1で両方のファイルをホストする場合、すべて問題ありません。特定の特別な状況のため、別のdomain2でjar2をホストする必要があります。

アプレットタグに、両方のファイルarchive = "jar1.jar、http: //domain2.com/jar2.jar"をリストします。

まず、うまく機能しているようです。両方のjarファイルがロードされ、すべてが正常に機能します。それでも、jarファイルの1つからリソース(画像など)にアクセスしようとするとすぐに問題が発生します。

jarファイルからリソースを取得するにはどうすればよいですか?最初にリソースの場所のURLを取得することで、リソースを取得します。

public static URL getURL(String name){return ResUtils.class.getResource(path);}

domain1で両方のjarをホストする場合、このメソッドはURLを返します。2つのドメインでホストされている場合、getURL(...)はNULLを返し、リソースをフェッチするときに例外が発生します。

Caused by: java.lang.IllegalArgumentException: input == null!
    at javax.imageio.ImageIO.read(Unknown Source)

ResUtils.class.getResourceはそのクラスローダーを使用してURLを返すと思います。何らかの理由で、2つのドメインで両方のjarをホストする場合、getRessource()への呼び出しを追加するとNULLが返されます。

だから私の質問は:

  • getURLがNULLを返すのはなぜですか?

Javaプラグインは、これらのjarを異なるドメインでホストできないように設計されていますか?異なるドメインでjarをホストする場合、どのようにリソースをロードする必要がありますか?

4

2 に答える 2

2

次のようなものを試してください。

      ClassLoader cl = Thread.currentThread().getContextClassLoader();
      URL url = cl.getResource("imagename.gif");
      System.out.println("URL is: " + url);
      ImageIcon icon = new ImageIcon(url);

コンテキストクラスローダーを使用することは、通常、jarファイルからイメージをロードするための最良の方法です。

編集1:ところで、最初の提案が機能しなかったことに驚いています。メモリが適切に機能する場合、Thread.currentThread()。getContextClassLoader()の提案により、いずれかのjarファイルからリソースを見つけることができるクラスローダーへの参照が提供されているはずです。

Edit2:この場合、上記のいずれも機能しません。好奇心が最高だったので、試してみました。プラグインクラスローダーは、クラスのロードに問題がない場合でも、別のサーバーでホストされているjarファイルからリソースをロードするには混乱しすぎているようです。私が見つけたのは、手動の方法次のようなリソースをロードするために機能することです。

  String manualString = "jar:http://spider.grunt.webhop.net/clubjar.jar!/club.gif";
  URL manualURL = new URL(manualString);
  BufferedImage buf = ImageIO.read(manualURL);
  System.out.println("manual buf: " +buf);

私には、これはプラグインクラスローダーのバグのように見えます。クラスローダーのgetResource()またはgetResourceAsStream()メソッドを使用して、有効なリソースを見つけることができるはずです。この場合はそうではありません。ImageIOクラスは手動URLを読み取ることができますが、クラスローダーはそれを提供できません。

于 2009-04-25T16:43:26.350 に答える
0

Thread.currentThread()。getContextClassLoader(); 私の問題は解決しません。

私のすべてのリソースは同じ'res'フォルダー/パッケージにあります-それらをフェッチするクラスと同じです:ResUtils(以下のソースを参照)。

domain1のjar1のクラスがResUtils.getImageIcon( "trash.gif");を呼び出す場合。getURL(...)はURLを返します:url-> jar:http://domain1/bun.jar!/res/trash.gif

domain2のjar2のクラスがResUtils.getImageIcon( "trash.gif");を呼び出す場合。getURL(...)はNULLを返します:url-> null

package res;

public class ResUtils {
       private static final String PATH =  "/" + (ResUtils.class.getPackage().getName().replace(".", "/")) + "/";
         public static URL getURL(String name)  {return ResUtils.class.getResource(PATH + name);}
          public static ImageIcon getImageIcon(String name) {
           return new ImageIcon(getBufferedImage(name));
       }

       public static BufferedImage getBufferedImage(String name) {
           try {
               URL url = getURL(name);
               return ImageIO.read(url);
           } catch (Exception e) {
               e.printStackTrace();
               return new BufferedImage(10,10, BufferedImage.TYPE_INT_RGB);
           }
       }
}
于 2009-04-25T18:22:41.183 に答える