Как загрузить ресурс из составного JAR? - PullRequest
1 голос
/ 28 апреля 2011

У меня следующая проблема:

Я пишу приложение, использующее некоторые JAR-файлы из платформы Netbeans. Если быть точным, я использую только визуальную библиотеку Netbeans для создания некоторых графиков. Это можно сделать без использования платформы Netbeans, извлекая 3 JAR-файла из платформы. Это все работает хорошо, за исключением 1 проблемы.

Немного фона

Я использую Java Simple Plugin Framework (JSPF) для управления моим плагином. Итак, у меня есть приложение, которое в основном состоит из каркасной структуры, и затем, в зависимости от того, какие JAR-плагины он находит, он может выполнять различные действия, одним из которых является рисование графиков. Плагин JAR для этой функции имеет все свои зависимые библиотеки внутри. Это можно сделать, экспортировав JAR как артефакт в IntelliJ, который разархивирует все зависимые библиотеки и переразметит их внутри вашей (так что все, что вам нужно, там).

Проблема

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

Мои мысли

Единственное, что я могу вспомнить, почему он не работает, это то, что это может быть, так как JAR плагина не находится в пути к классам. Может ли это быть так?

Есть ли способ указать каталог classpath в MANIFEST? В противном случае я должен создать свой собственный ClassLoader и вручную загрузить все файлы JAR в каталог плагинов?

Спасибо!


UPDATE:

Я впоследствии определил, что это действительно проблема с classpath. Если я помещаю свою составную библиотеку в путь к классам, все работает отлично. Проблема, с которой я сейчас сталкиваюсь, такова:

  1. Если я копирую библиотеку в /Library/Java/Home/lib/ext/, она работает нормально. Если я выполню приложение с java -cp "/path/to/plugins/myLib.jar" -jar Application.jar, оно не будет работать.
  2. Как я могу загрузить все jar-файлы из каталога плагинов в свое приложение, чтобы использовать ресурсы внутри них?

Еще раз спасибо!

Ответы [ 2 ]

1 голос
/ 29 апреля 2011

Итак, я наконец понял, что происходит.При создании исполняемого файла jar файл MANIFEST.MF переопределяет любой путь к классу, указанный в командной строке, что делает его бесполезным, если вы хотите указать внешние файлы jar.Похоже, это общая проблема, которая регистрируется начиная с Java 1.3.

Мое простое решение - просто , а не , создать исполняемый файл jar, а затем запустить приложение с помощью скрипта:

java -cp App.jar:plugins/* my.package.structure.App

, который отлично работает.

0 голосов
/ 28 апреля 2011

Загрузчик классов по умолчанию не загружает классы во вложенных банках.Вам нужно написать свой собственный загрузчик классов, чтобы получить классы во вложенных банках.

Вы можете ознакомиться с этой статьей jspf ...

"Я забыл: добавление зависимостей в виде JAR внутри JAR-файловне возможно, потому что это не будет работать во всех сценариях (например, апплеты); у IIRC также были бы такие инструменты, как Eclipse, если бы вы использовали классы с неразрешенными (читай: runtime-resolved-dependencies). Насколько мне известно, не существует установленного способавсе же изящно обрабатывать вложенные JAR при любых обстоятельствах. "

http://code.google.com/p/jspf/wiki/UsageGuide

...