Узнайте зависимости для пакета any .jar
Вопрос
Я разрабатываю пакеты OSGi с использованием Eclipse.Я тестирую код, используя конфигурацию среды выполнения Eclipse OSGi.
Код там работает нормально, но когда я экспортирую пакеты в виде jar и пытаюсь использовать их в другой среде (например, pax-runner) Я получаю исключения ClassNotFound во время выполнения.Пакеты устанавливаются нормально, без ошибок.Я выполняю команду в день равноденствия:"diag bundle-номер пакета", и там написано:"Нет неразрешенных ограничений" для каждого пакета.
Я хотел бы знать, есть ли инструмент / метод, который нужно знать для данного пакета .jar, нужна ли ему какая-либо внешняя библиотека, которая не описана в manifest.mf.
Решение
Ваш пакет будет разрешен, если все пакеты перечислены в Import-Package
(и пучки перечислены в Require-Bundle
) находятся во время выполнения. Если вы получите ClassNotFoundException
или NoClassDefFoundError
После разрешения это означает, что содержание Import-Package
был неправ.
Посмотрите на BND Tool от Peter Kriens. Отказ Это выполняет статический осмотр Bytecode Completed из ваших классов, чтобы обнаружить точные зависимости, и он генерирует Import-Package
заявление для вас. В целом, если вы используете BND, вы никогда не сможете увидеть Classnotfound / noclassdeffound, если только динамически загружают классы по имени, например, с Class.forName()
.
Другие советы
JBoss только что выпустил фантастический диагностический инструмент с открытым исходным кодом о зависимости: http://jboss.org/tattletale.
Одной из функций является анализ файлов JAR путем самоанализ, чтобы найти все недостающие зависимости.
Я сделал что-то подобное некоторое время назад (я был перекрестным с компиляцией Java .NET через IKVM, но нуждались в зависимости между банками) Яраналезер создать график зависимостей.
Я добился успеха с помощью инструмента SpringSource bundlor-shell.Есть инструкции по его использованию здесь.Вы предоставляете ему JAR вместе с именем и версией для нового пакета, который вы хотите создать из этого JAR.Затем он анализирует файлы классов внутри JAR и создает манифест шаблона, который импортирует любые пакеты, ссылки на которые он находит.
Затем остается самое сложное - определить, какие зависимости являются необязательными и от какой версии каждого пакета зависеть.Вы должны прочитать веб-сайт, примечания к выпуску и т.д.чтобы библиотека разобралась в этом.
Вы получите "Нет неразрешенных ограничений", если пакет фактически не импортирует никаких пакетов или не требует других пакетов;что касается среды выполнения OSGi, пакет будет пригоден для использования.Но как только он обратится к внешнему классу, как в вашем случае, вы получите страшное ClassNotFoundException
.
Окружающая среда разработки Eclipse (PDE) предоставляет ошибки компиляции, если ваш код использует классы, которые не перечислены в Mainest.mf. Классические исключения во время выполнения часто вызываются неправильной маркировкой импорта пакета в качестве необязательной - разрешения пакетов, но они не будут работать. Компиляция по отношению к другой версии пучка или пакета, чем вы работаете, может также вызвать этот вид ошибки.