Вопрос

Я разрабатываю пакеты 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. Классические исключения во время выполнения часто вызываются неправильной маркировкой импорта пакета в качестве необязательной - разрешения пакетов, но они не будут работать. Компиляция по отношению к другой версии пучка или пакета, чем вы работаете, может также вызвать этот вид ошибки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top