Узнайте зависимости для любого пакета .jar

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

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

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


person Hectoret    schedule 31.08.2010    source источник
comment
Возможно, исключение возникает после вызова Class.forName (). Невозможно предсказать классы, которые будут загружаться динамически. Можете ли вы добавить трассировку стека?   -  person gawi    schedule 31.08.2010
comment
Баночка может содержать массу ссылок на классы, определенные где-то еще. Пока они не используются во время выполнения, они не могут считаться зависимостями. Так что будьте осторожны при проверке банок.   -  person gawi    schedule 31.08.2010


Ответы (5)


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

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

person Neil Bartlett    schedule 02.09.2010

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

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

person Benoit Courtine    schedule 31.08.2010

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

person Michael Lloyd Lee mlk    schedule 31.08.2010

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

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

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

person Richard Fearn    schedule 03.09.2010

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

person Holly Cummins    schedule 22.05.2012