Использовать ограниченный класс в пакете OSGi

Для публикации с использованием SSL с использованием конечной точки мне нужен доступ к классам в пакетах com.sun.net.httpserver.*

Используя Eclipse IDE, я нашел способ использовать эти классы. Но экспортируя пакеты и запуская их в другой установке равноденствия OSGi, я не могу запустить пакет, выдавая следующую ошибку:

java.lang.NoClassDefFoundError: com/sun/net/httpserver/HttpsConfigurator

Кто-нибудь знает, как решить эту проблему?

Спасибо!


person mpsat    schedule 18.02.2014    source источник
comment
У вас должен быть com.sun.net.httpserver как импортированный пакет в вашем бандле, а внутри контейнера у вас должен быть какой-то бандл, который экспортирует этот пакет.   -  person Gábor Lipták    schedule 19.02.2014
comment
Приведенное ниже решение Марселя действительно является решением вашего вопроса, но ИМХО это не тот путь (и очень маловероятно, что это действительно необходимо). Пакеты com.sun.* предназначены для частного использования и должны рассматриваться как таковые. Вероятно, есть более стандартное решение вашей проблемы. Если вы подробно изложите проблему, вы можете получить еще лучшее решение.   -  person Arie van Wijngaarden    schedule 19.02.2014


Ответы (1)


Пакет, о котором вы говорите, является частью JDK. Вам нужно выставить его, чтобы сделать его доступным в OSGi, и у вас есть два варианта:

Первый и в большинстве случаев предпочтительный вариант — предоставить доступ к этому пакету через системный пакет. Платформа OSGi имеет свойство, которое вы можете установить для этого:

org.osgi.framework.system.packages.extra=...

В качестве его значения вы предоставляете ему разделенный запятыми список пакетов, которые вы хотите выставить, поверх тех, которые уже выставлены фреймворком. В вашем случае, по крайней мере, com.sun.net.httpserver, но может быть и больше пакетов, которые вам нужны. В этом случае также убедитесь, что пакет, который использует этот пакет, импортирует этот пакет.

Второй вариант заключается в использовании механизма делегирования загрузки. Его следует использовать только в крайнем случае, так как он нарушает модульность, и если его использовать неосторожно, это может привести к другим проблемам. Опять же, это свойство, которое вам нужно установить:

org.osgi.framework.bootdelegation=*

Здесь вы можете указать список пакетов, разделенных запятыми, которые должны быть загружены загрузчиком загрузочного класса. Подстановочные знаки поддерживаются (как показано в примере выше), но вам рекомендуется быть как можно более конкретным, поэтому в вашем случае, например, используйте com.sun.* в качестве значения.

person Marcel Offermans    schedule 18.02.2014
comment
У меня такая же проблема с KURA, которая работает над eclipse Equinox, как я могу установить свойство для системного пакета? - person sabrina2020; 19.11.2015