Апплет загружает баночки из разных доменов; не удается загрузить ресурсы (например, изображения) из банок - PullRequest
2 голосов
/ 25 апреля 2009

У меня есть апплет в песочнице, но это не должно иметь значения.

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

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

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

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

общедоступный статический URL getURL (имя строки) {return ResUtils.class.getResource (path);}

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

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

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

Итак, мой вопрос:

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

Плагин Java предназначен для запрета размещения этих jar-файлов в разных доменах? Как мне загрузить свои ресурсы, когда я размещаю файлы jar в разных доменах?

Ответы [ 2 ]

2 голосов
/ 25 апреля 2009

Попробуйте что-то вроде этого:

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

Использование контекстного загрузчика классов, как правило, является лучшим способом загрузки изображений из файлов JAR.

Edit1: Кстати, я удивлен, что первое предложение не сработало. Если память мне не изменяет, предложение 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);

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

0 голосов
/ 25 апреля 2009
.

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

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

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

Если класс в jar2 из domain2 вызывает 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);
           }
       }
}
...