OSGi — получение java.lang.NoClassDefFoundError: org/omg/CORBA/Object

Я запускаю пример класса JAVA Swing, который обращается к серверной части REDHAWK через CORBA (jacorb). Примером является приложение OSGi. Внутри Eclipse я запускаю проект, используя конфигурацию запуска OSGiFramework. Приложение работает, как и ожидалось, обмениваясь данными с серверной частью REDHAWK и открывая пользовательский интерфейс Java Swing. Я запускаю приложение вне Eclipse, используя файлы config.ini и dev.properties, созданные Eclipse. Я получаю следующую ошибку с аргументами командной строки, показанными ниже. Из консоли я проверил, что пакет jacorb установлен и активен.

/usr/lib/jvm/java-1.7.0-openjdk/bin/java -jar ./org.eclipse.osgi_3.8.2.v20130124-134944.jar  -dev file:dev.properties -os linux -ws gtk -arch x86 -application com.viper.swing.application -consoleLog -console

java.version=1.7.0_51
java.vendor=Oracle Corporation
BootLoader constants: OS=linux, ARCH=x86, WS=gtk, NL=en_US
Framework arguments:  -application com.viper.swing.application
Command-line arguments:  -dev file:dev.properties -os linux -ws gtk -arch x86 -application com.viper.swing.application -consoleLog -console

!ENTRY org.eclipse.osgi 4 0 2014-03-21 10:38:58.446
!MESSAGE Application error
!STACK 1
java.lang.NoClassDefFoundError: org/omg/CORBA/Object
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:188)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClassHoldingLock(ClasspathManager.java:632)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass(ClasspathManager.java:607)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:568)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:492)
at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:465)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:216)
at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:395)

...

    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:353)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:180)
at org.eclipse.core.runtime.adaptor.EclipseStarter.main(EclipseStarter.java:151)

Вызвано: java.lang.ClassNotFoundException: org.omg.CORBA.Object в org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:501) в org.eclipse.osgi.internal.loader.BundleLoader. findClass(BundleLoader.java:421) в org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:412) в org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107) на java.lang.ClassLoader.loadClass(ClassLoader.java:358) ... еще 75


person JONATHAN LUELLEN    schedule 21.03.2014    source источник


Ответы (2)


В стандартных средах OSGi только пакеты java.* автоматически импортируются в пакет структурой OSGi. Все остальные пакеты необходимо явно импортировать с помощью оператора Import-Package в манифесте.

Особенно известно, что eclipse/equinox делегирует разрешение классов классов, которые обычно поставляются с JRE, стандартному загрузчику классов VM в его среде отладки/запуска. Это означает, что если вы запускаете пакеты вне среды eclipse, вы получаете жалобы на отсутствие импорта или исключение класса, не найденного.

Решение состоит в том, чтобы либо исправить импорт, либо адаптировать внешнюю среду, чтобы она работала так, как если бы она работала в eclipse. Последнее можно сделать, добавив следующую строку в конфигурацию (т.е. configuration/config.ini):

org.osgi.framework.bootdelegation=*
person Arie van Wijngaarden    schedule 25.03.2014

Добавьте оператор Import-Package в свой файл Manifest.MF.

 Import-Package: org.omg.CORBA
person Martin Baumgartner    schedule 23.03.2014
comment
К сожалению, это не сработало для меня. Он работает правильно, когда я запускаю его в Eclipse, используя конфигурацию запуска OSGi. Если бы манифест был неправильным, я бы подумал, что он там не сработает. - person JONATHAN LUELLEN; 24.03.2014