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

За публикуване с SSL с помощта на крайната точка трябва да имам достъп до класове под пакетите com.sun.net.httpserver.*

С помощта на Eclipse IDE намерих начин да използвам тези класове. Но при експортиране на пакетите и стартирането им в друга инсталация на equinox 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
Решението на Марсел по-долу наистина е решението на вашия въпрос, но IMHO това не е пътят (и е много малко вероятно това наистина да е необходимо). Пакетите 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