2009-04-25 3 views
2

У меня есть изолированный апплет, но это не должно иметь значения.Апплет загружает банки из разных доменов; имеет проблемы с загрузкой (например, изображения) из банок

Апплет состоит из 2 банок. Если я размещаю оба файла в одном домене1, все в порядке. Из-за некоторых особых обстоятельств мне нужно разместить jar2 в другом домене2.

В теге апплета я перечисляю архив обоих файлов = "jar1.jar, http://domain2.com/jar2.jar".

Сначала кажется, что он работает отлично. Оба баночки загружены, и все работает нормально. Тем не менее, как только я пытаюсь получить доступ к ресурсу (например, к изображению) из INSIDE, одна из банок возникает.

Как получить ресурсы из своих банок? я получаю ресурсы, первым получать URL для размещения ресурса:

общественный статический URL GetURL (имя String) {возвращение ResUtils.class.getResource (путь);}

Если я у себя обе банки на domain1 этот метод возвращает URL-адрес. Когда размещается на двух доменах GetURL (...) возвращает NULL, который затем приводит к исключению при выборке ресурса:

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

Я думаю ResUtils.class.getResource использует ClassLoader вернуть URL. По какой-то причине при размещении обеих банок на двух доменах добавляются вызовы getRessource() return NULL.

Так что мой вопрос:

  • Почему GetURL возврата NULL?

Является ли плагин Java запрещенным размещать эти банки в разных доменах? Как мне загрузить мои ресурсы, когда я размещаю банки в разных доменах?

Я застрял в течение недели теперь - спасибо за вашу помощь,

ответ

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: BTW, я удивлен, что первое предложение не сработало. Если функция памяти мне подходит, предложение Thread.currentThread(). GetContextClassLoader() должно было дать вам ссылку на загрузчик классов, в котором могли бы располагаться ресурсы из файла jar.

Редактировать 2: в этом случае ни одно из вышеперечисленных работ не работает. Любопытство получило лучшее из меня, поэтому я должен был попробовать. Класс-загрузчик плагинов кажется слишком запутанным для загрузки ресурсов из файлов 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); 

Для меня это выглядит как ошибка с плагином загрузчиком классов. Мы должны иметь возможность использовать методы classloader getResource() или getResourceAsStream() для поиска действительного ресурса. Не так в этом случае. Класс ImageIO может читать наш ручной URL-адрес, но загрузчик классов не может дать нам один.

+0

Спасибо за вашу большую помощь. По крайней мере, я больше не чувствую себя полным идиотом. Этот ручной стиль, который вы в основном просто набрали, или есть хороший способ его получить? Btw, банка из первого домена МОЖЕТ загружать ресурсы изнутри. –

+0

Можете ли вы опубликовать ссылку на ваш пример апплета, который не работает? –

+0

https://iris.dev.java.net также использует банки из разных доменов. Я могу только догадываться, что им не нужно загружать ресурсы из банок со второго домена. –

0

Thread.currentThread(). GetContextClassLoader(); не решает мою проблему.

Все мои ресурсы находятся в той же папке/пакете res, что и класс, чтобы получить их: ResUtils (см. Источник ниже).

Если класс в jar1 из домена1 вызывает ResUtils.getImageIcon ("trash.gif"); getURL (...) возвращает URL-адрес: url -> jar: http://domain1/bun.jar!/res/trash.gif

Если класс в jar2 из домена2 вызывает 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); 
      } 
     } 
} 
+0

Ваш ResUtils.getURL() использует загрузчик классов, загружающий класс ResUtils для загрузки всех ваших изображений. ResUtils должны быть расположены в jar1 в вашем случае. Я считаю, что плагин Java будет использовать отдельные загрузчики классов для загрузки баннеров из разных доменов. Класс ResUtils знает только об одном загрузчике классов. См. Следующий ответ для кода. – Gary

+0

Кстати, ваш раздел кода намного легче читать, если разместить весь свой код с помощью кодовой метки – Gary

+0

Я знаю. Я пытался это сделать, но он только украсил «пакет res»; Назад к проблеме с URL. Ничего не работает. Я попробовал все возможные комбинации. Nada - все URL-адреса возвращены Null. Даже простой URL url = Class2.class.getResource ("res/trash2.gif"); не работает, хотя trash2.gif находится в jar2.jar, размещенном на домене2. Я был бы счастлив, если бы был доказан неправильно, но до тех пор я думаю, что невозможно загрузить любые ресурсы из классов в jar2, даже если ресурсы находятся в jar2. У меня есть Java 1.6_u14 - возможно, они что-то изменили. –