ClassNotFoundException для разрешенного OSGI-пакета - PullRequest
0 голосов
/ 16 мая 2019

У меня небольшая проблема с программным решением, которое я поддерживаю.Ранее мы переместили все решение с Java 1.7 на Java 1.8 и, наконец, снова запускаем большинство программ.

Теперь я столкнулся с проблемой.В моем встроенном продукте определенный класс не может быть загружен.Этот класс происходит из пакета в jar, который является обязательным пакетом в манифесте вызывающего пакета.

Довольно странно, что пакет разрешается при запуске среды osgi, поэтому я предполагаю, что .jarнайден правильно.Как только программа пытается загрузить определенный диалог, я получаю ClassNotFoundException.

В моей среде IDE диалог работает безупречно, просто встроенный продукт не может загрузить класс во время выполнения (хотяпакет, содержащий его, разрешается).

Графическое представление того, что происходит:

+-----------------------+   +---------------------------+
|xtext....jar           |   |MyProject                  |
|.                      |   |.                          |
|.                      |   |.                          |    +-------------------------+
|.                      |   | MANIFEST.MF               |    |ClassNotFoundException   |
|  MANIFEST.MF          +---> -Bundle-Name:MyBundle     +--->+at runtime in built      |
|  -Bundle-Name:X-Bundle|   | -Require-Bundle:X-Bundle  |    +version                  |
|  -Export-Package:x    |   |                           |    +-------------------------+
|.                      |   |                           |
|.                      |   +---------------------------+
|DeltaConverter.class   |
|                       |
+-----------------------+

Класс DeltaConverter не найден во встроенной версии во время выполнения, хотя пакет разрешен, и у меня естьнеобходим пакет для использования пакета.

Есть подсказки, что здесь может происходить?

Ответы [ 2 ]

1 голос
/ 16 мая 2019

TL; DR:

Убедитесь, что ваши классы package экспортированы в META-INF/MANIFEST.MF.


Длинная версия:

Даже если Bundleразрешен и активен, это не означает, что класс доступен в других пакетах или частях системы.

package, в котором находится класс, должен быть экспортирован.Каждый комплект имеет META-INF/MANIFEST.MF.По сути, это похоже на описание пакета.

В этом описании есть поле с именем Export-Package, которое содержит список всех экспортируемых пакетов и, следовательно, может использоваться в других пакетах.

Обычно META-INF/MANIFEST.MF создается во время вашей сборки в Maven или Gradle через плагины.Проверьте конфигурацию этих плагинов или посмотрите, как они работают.Например, некоторые плагины не будут экспортировать пакеты ниже impl пакетов.

Так что, если ваш класс находится в пакете com.example.awesomeapp.impl.services, пакет service не будет экспортирован.Но это зависит от используемого вами плагина и т. Д.

Все это работает в вашей IDE, потому что он обрабатывает classpath иначе, чем ваша среда OSGi.Вкратце: ваша IDE знает более или менее только один путь к классам, который содержит все классы, в то время как OSGi использует много путей к классам (по одному на пакет и пару других путей к классам) и поэтому «скрывает» классы друг от друга.Вот почему ваша IDE может загружать класс, а ваши OSGi - нет.

0 голосов
/ 23 мая 2019

Кажется, сейчас работает. Проблема исчезла, когда я попытался исправить проблему, я думал, что это не связано с этим. У меня было 2, по-видимому, несвязанных файла jar (org.objectweb.asm_3.3.1 и org.objectweb.asm_5.0.1) на нашем сервере сборки. При сборке использовалась более старая версия, которую я затем удалил с сервера сборки, поэтому она может использовать только более новую версию. После изменения этого, кажется, все работает сейчас, хотя я действительно не понимаю, почему это решило проблему. Странно, что ни этот jar-файл, ни какой-либо из пакетов или классов, содержащихся в этом jar-файле, прямо не упоминаются в стековых трассах, которые я получил из своих исключений.

...