2010-01-27 9 views
3

У меня есть исходный код:ClassLoader на виртуальной машине

private Image getImage(String path, ClassLoader loader) { 
    InputStream image = null; 
    try { 
     image = loader.getResourceAsStream(path); 
     return new Image(PlatformUI.getWorkbench().getDisplay(), image); 
    } finally { 
     if (image != null) { 
      try { 
       image.close(); 
      } 
      catch (IOException e) { 
       //OK 
      } 
     } 
    } 
} 

На моем компьютере этот код работает идеально. Но на виртуальной машинной линии:

loader.getResourceAsStream(path); 

всегда возвращает null. Зачем?

EDIT:

Путь - это относительный путь. Например: icons/tools/device.png. Приложение, которое я разрабатываю, содержит более десяти проектов. Я использую Eclipse IDE. Все проекты имеют структуру:

  • com.pkg.name - папку с классами иконок
  • папку с иконками и другими файлами

Jar файлы имеют такую ​​структуру тоже.

На моих компьютерах работает отлично. На виртуальной машине (Windows Server (64-разрядная версия)) приложение не может загружать изображения из файла Jar.

+2

Не могли бы вы прояснить, о какой VM вы говорите? Я, хотя JVM на первый взгляд, но это может быть неправильное предположение. –

+0

Конечно. Виртуальная машина означает 64-битный Windows Server. http://en.wikipedia.org/wiki/Virtual_machine. –

+1

Другой вопрос - это стандартное приложение java, OSGI или даже RCP? Если это OSGi или RCP, тогда проблема может быть решена путем двойной проверки манифеста и их разделов экспорта/импорта. –

ответ

1

Если путь является относительным путем, то он должен работать, если ресурс изображения был скопирован вместе с файлами класса (как уже упоминалось выше), а папка или банка, содержащая ресурс изображения, находится в пути к классам (вы используете CLASSPATH или -cp для указания пути к классу? Если вы полагаетесь на CLASSPATH, убедитесь, что эта переменная среды правильно установлена ​​для пользователя, выполняющего приложение).

Если это абсолютный путь, дважды проверьте если он действителен на целевой виртуальной машине.

так в основном, для структуры папок, как

./classes 
./images 
./libs 

командование java -cp classes;images;libs/* my.app.Application должен работать (Java 1.6 - в более старых версиях подстановочные не допускается), предполагая, что значение пути, как images/myImage.jpg.

Просто еще одна мысль, разделитель по классам - это ; на Windows и : на unix. Это может быть проблемой, если вы подготовили приложение в среде типа unix.

Редактировать

Читаете ли вы изображение из той же библиотеки, как вы фактический файл классов?Тогда, пожалуйста, дайте этому попытку:

this.getClass().getResourceAsStream(path) 

Редактировать

ОК, это OSGi. Таким образом, есть еще несколько причин, по которым приложение работает из среды eclipse, но не при развертывании в качестве приложения RCP. Я думаю, что это не имеет ничего общего с целевой средой.

В OSGi каждый комплект имеет собственный загрузчик классов, а класс из bundle1 не сможет видеть классы из bundle2, если пакеты не будут правильно экспортированы. Это справедливо и для ресурсов. Я думаю, что изображение хранится в другом комплекте. Я не знаю, какой classloader передается методу getImage, но этот загрузчик классов определенно не может видеть файл ресурса.

Это может работать внутри затмения, особенно если вы добавляете проекты друг к другу, создавая пути.

После того, как вы построили продукт, вы сказали, что он не работает (частично) на виртуальной машине, но показывает тот же продукт на локальном компьютере (вне затмения)?

+0

Я не использую CLASSPATH. CLASSPATH требуется ClassLoder? –

+0

Я протестировал этот метод (this.getClass(). GetResourceAsStream (путь)). К сожалению, всегда возвращается значение null. –

+0

«Отображает ли тот же продукт изображение на локальной машине (за пределами затмения)?» Нет! Ты был прав! Я провел много тестов. Теперь все работает. Я использовал загрузчик классов из моего класса, который наследуется от UDIGApplication. Я загружаю изображения в метод «init» этого класса. Спасибо за помощь. –

0

Вы не поставляете достаточное количество деталей, но вот мое предположение:

При копировании кода в место, где он будет работать на другой (виртуальной) машине копировалась только * .class файлов. Вам нужно скопировать другие ресурсы (в частности, файлы изображений) и разместить их вместе с файлами * .class, чтобы класс-класс мог их восстановить.

При разработке кода с помощью Eclipse (или других IDE) Eclipse берет на себя обязательство копировать ваши ресурсы из каталога src/в каталог bin /.

+0

Я уверен, что все файлы существуют на виртуальной машине. Я всегда экспортирую исходный код в файл Jar. Jar содержит все файлы ресурсов. –

Смежные вопросы