2012-06-30 4 views
1

Я использую функцию HotSwap javassist, для этого требуется tools.jar в пути к классам, поэтому я добавил -cp tools.jar, когда начал использовать приложение OSGi. Но когда я new HotSwap() в коде одного из пучков,Я уже добавил tools.jar в classpath, почему все еще java.lang.NoClassDefFoundError: com.sun.jdi.Bootstrap throw?

java.lang.NoClassDefFoundError: com.sun.jdi.Bootstrap 

был брошен. com.sun.jdi.Bootstrap находится в tools.jar и я уже добавил его в пути к классам, а также я проверил это сработало, потому что если нет, то следующий код не будет работать:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 

загрузчик классы из HotSwapper не может загрузить класс com.sun.jdi.Bootstrap? Тогда почему он корректно работает в моей среде Eclipse? (Я добавил tools.jar в библиотеки Build path)

О том, почему NoClassDefFoundError оценивается.

+0

osgi имеет концепцию «среды исполнения», которая представляет собой список пакетов. Ваша инфраструктура osgi не позволит вам получить что-то, что связано с системным пакетом. –

+0

Запуск в Eclipse немного отличается, затмение - это больше relex, потому что ему нужны все эти вещи для разработчиков. –

+0

@ J-16 SDiZ спасибо, но как я могу получить к нему доступ? Потому что 'HotSwapper' нуждается в этом. – JerryCai

ответ

0

В равноденствии, можно установить загрузочные делегации в * получить Асесс всего класса в bootclass см this wiki для деталей. В 3.2 это было osgi.compatibility.bootdelegation=true в config.ini.

+0

Я попробую, спасибо. – JerryCai

+0

И если вы это сделаете, вы в значительной степени потеряли преимущество модульности, потому что вы прокололи большую дыру в ней ... –

3

Вы должны убедиться, что системный пакет экспортирует этот пакет. Например, в Felix файл jre.properties определяет, какие пакеты экспортируются системным пакетом. Добавьте пакет com.sun.jdi, и он должен работать.

В eclipse это делается в config.ini. Вы можете использовать org.osgi.framework.system.packages.extra = для определения дополнительных пакетов для экспорта. Я бы предпочел не использовать boodelegation = *, поскольку он мог бы также экспортировать нежелательные пакеты. См:

http://www.eclipse.org/forums/index.php/m/734358/

http://wiki.eclipse.org/Equinox_Boot_Delegation

+0

Я не могу найти такой файл 'jre.properties' в моей среде Equinox. Какая папка будет такой, как внутри или что внутри? Я могу искать в папке. – JerryCai

+0

Для равноденствия, как для eclipse, это свойство org.osgi.framework.system.packages, которое вы можете установить для экспорта желаемых пакетов. Если вы хотите только добавить пакеты к используемым по умолчанию, используйте org.osgi.framework.system.packages.extra –