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 пакета.
Распространенные ошибки:
- Забыть включить jar-зависимости также в classpath пакета.
- Забыть включить jar в комплект при сборке / экспорте.
- Забыв импортировать пакеты, которые нужны банкам продукта.
Все это приведет к некоторому виду ClassNotFoundException. У меня сложилось впечатление, что в вашей ситуации проблема может быть связана с 1.