Я уже добавил tools.jar в путь к классам, почему до сих пор выбрасывается java.lang.NoClassDefFoundError: com.sun.jdi.Bootstrap?

Я использую функцию HotSwap из javassist, для этого требуется tools.jar в пути к классам, поэтому я добавил -cp tools.jar при запуске мое приложение OSGi. Но когда я new HotSwap() в коде одной из связок,

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

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

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

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

Любая подсказка приветствуется, почему NoClassDefFoundError.


person JerryCai    schedule 30.06.2012    source источник
comment
osgi имеет концепцию среды выполнения, которая представляет собой список пакетов. Ваша структура osgi не позволит вам получить доступ к чему-то из системного пакета.   -  person J-16 SDiZ    schedule 30.06.2012
comment
Запуск в Eclipse немного отличается, eclipse более удобен, потому что ему нужны все эти материалы для разработчиков.   -  person J-16 SDiZ    schedule 30.06.2012
comment
@ J-16 SDiZ спасибо, но как я могу получить к этому доступ? Потому что это нужно HotSwapper.   -  person JerryCai    schedule 01.07.2012


Ответы (2)


В Equinox вы можете установить для Boot Delegation значение *, чтобы получить доступ ко всем классам в bootclass. Детали. В 3.2 это было osgi.compatibility.bootdelegation=true в config.ini.

person J-16 SDiZ    schedule 01.07.2012
comment
И если вы сделаете это, вы в значительной степени потеряете преимущество модульности, потому что проделаете в ней большую дыру... - person Peter Kriens; 01.07.2013

Вы должны убедиться, что пакет системы экспортирует этот пакет. Например, в 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

person Christian Schneider    schedule 30.06.2012
comment
Я не могу найти такой файл jre.properties в своей среде Equinox. В какой папке он будет находиться или что внутри? Я могу искать в папке. - person JerryCai; 01.07.2012
comment
Для равноденствия, как и для eclipse, это свойство org.osgi.framework.system.packages, которое вы можете настроить для экспорта нужных пакетов. Если вы хотите добавить пакеты только к пакетам по умолчанию, используйте org.osgi.framework.system.packages.extra - person Christian Schneider; 03.07.2013