Узнайте зависимости для любого пакета .jar - PullRequest
3 голосов
/ 31 августа 2010

Я разрабатываю комплекты OSGi с использованием Eclipse.Я тестирую код, используя конфигурацию времени выполнения Eclipse OSGi.

Код работает там хорошо, но когда я экспортирую пакеты в виде jar-файлов и пытаюсь использовать их в другой среде (например, pax-runner), я получаюИсключения ClassNotFound во время выполнения.Комплекты установлены нормально, без ошибок.Я выполняю команду в день равноденствия: «номер пакета diag», и он говорит: «Нет неразрешенных ограничений» для каждого пакета.

Я хотел бы знать, есть ли инструмент / метод, который нужно знать, для данногоПакет .jar, если ему нужна внешняя библиотека, которая не описана в manifest.mf.

Ответы [ 5 ]

2 голосов
/ 31 августа 2010

JBoss только что выпустил фантастический инструмент диагностики с открытым исходным кодом о зависимостях: http://jboss.org/tattletale

Одной из функций является анализ файлов JAR с помощью самоанализа, чтобы найти все недостающие зависимости.

2 голосов
/ 03 сентября 2010

Ваш пакет разрешится, если все пакеты, перечисленные в Import-Package (и пакеты, перечисленные в Require-Bundle), будут найдены во время выполнения.Если после разрешения вы получите ClassNotFoundException или NoClassDefFoundError, это означает, что содержимое Import-Package было неверным.

Взгляните на инструмент Bnd от Peter Kriens .Он выполняет статическую проверку байт-кода, скомпилированного из ваших классов, чтобы обнаружить точные зависимости, и генерирует для вас оператор Import-Package.В общем, если вы используете Bnd, вы никогда не должны видеть ClassNotFound / NoClassDefFound, если только классы не загружаются динамически по имени, например, с Class.forName().

1 голос
/ 04 сентября 2010

Я успешно пользовался инструментом SpringSource, работающим в оболочке Bundlor.Инструкции по его использованию здесь .Вы даете ему JAR вместе с именем и версией для нового пакета, который вы хотите создать из этого JAR.Затем он анализирует файлы классов внутри JAR и создает манифест шаблона, который импортирует все пакеты, на которые он находит ссылки.

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

Вы получите «Нет неразрешенных ограничений», если пакет фактически не импортирует какие-либо пакеты или не требует других пакетов;Что касается времени выполнения OSGi, пакет будет пригоден для использования.Но как только он получит доступ к внешнему классу, как в вашем случае, вы получите ужас ClassNotFoundException.

1 голос
/ 31 августа 2010

Некоторое время назад я делал что-то подобное (я кросс-компилировал Java в .NET через IKVM, но мне нужны были зависимости между Jars). Я использовал JarAnalyzer для создания графика зависимостей.

0 голосов
/ 22 мая 2012

Среда разработки плагинов Eclipse (PDE) выдаст вам ошибки компиляции, если в вашем коде используются классы, которых нет в списке MANIFEST.MF.Исключения ClassNotFound во время выполнения часто вызваны неправильной маркировкой импорта пакетов как необязательного - пакеты разрешаются, но они не будут работать.Компиляция с использованием другой версии пакета или пакета, с которым вы работаете, также может вызвать такую ​​ошибку.

...