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

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

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

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

У кого-нибудь есть идея, как решить эту проблему?

Спасибо!

1 ответ

Решение

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

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

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

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

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

org.osgi.framework.bootdelegation=*

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

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