OSGi и родные события

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

У меня нет исходного кода этой библиотеки, поэтому я не могу точно указать, как приложение на самом деле взаимодействует.

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

Используя OSGi, этот класс событий не может быть загружен с java.lang.NoClassDefFoundError исключение. Каждое событие запускается в своей новой теме. Пакет импортирован правильно, и я могу использовать класс по всему коду.

Библиотека, которую я использую, - это библиотека HACL от IBM.

Это проблема API? или это из-за того, как обрабатываются нативные события? Могу ли я как-нибудь сделать OSGi Classloader известным этим новым потокам?

Благодарю.

Полная трассировка стека:

Exception in thread "Thread-20" java.lang.NoClassDefFoundError: com/ibm/eNetwork/ECL/event/ECLPSEvent
Caused by: java.lang.ClassNotFoundException: com.ibm.eNetwork.ECL.event.ECLPSEvent
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)

2 ответа

Вам нужно иметь pcseclj.jar в вашем пути к классам. Он поставляется, например, с IBM Personal Communications 6.0, которую вы можете загрузить, например, с https://www.ibm.com/developerworks/downloads/r/pcomm/

Вы найдете файл jar в

/mtri1006/combo/Disk1/program files/IBM/Personal Communications

после распаковки пробной версии.

Прежде всего: я не знаю продукт IBM, который вы используете, но только делаю предложения из других внешних библиотек, которые я использовал в OSGi.

Предлагаемый способ состоит в том, чтобы включить все jar-файлы, необходимые для работы внешней библиотеки, в ваш собственный пакет (обычное решение - поместить их в отдельную папку) и расширить путь к классу пакета, чтобы адаптировать эту ситуацию. Обратите внимание, что вам нужно указать все банки здесь. Пример:

Ваш продукт состоит из "a.jar" и "b.jar", и вы скопировали их в каталог lib / в вашем пакете, тогда путь к классу пакета должен быть:

Bundle-ClassPath: .,lib/a.jar,lib/b.jar

предполагая, что ваш собственный код идет в корень jar пакета.

Распространенные ошибки:

  1. Забыть включить jar-зависимости также в classpath пакета.
  2. Забыть включить jar в комплект при сборке / экспорте.
  3. Забыв импортировать пакеты, которые нужны банкам продукта.

Все это приведет к некоторому виду ClassNotFoundException. У меня сложилось впечатление, что в вашей ситуации проблема может быть связана с 1.

Другие вопросы по тегам