【问题标题】:OSGi - getting java.lang.NoClassDefFoundError: org/omg/CORBA/ObjectOSGi - 获取 java.lang.NoClassDefFoundError: org/omg/CORBA/Object
【发布时间】:2014-04-29 07:52:29
【问题描述】:

我正在运行一个示例 JAVA Swing 类,该类通过 CORBA (jacorb) 访问 REDHAWK 后端。该示例是一个 OSGi 应用程序。在 Eclipse 内部,我使用 OSGiFramework 运行配置运行项目。该应用程序按预期工作,与 REDHAWK 后端通信并弹出 Java Swing UI。我使用 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 更多

【问题讨论】:

    标签: eclipse-plugin osgi equinox osgi-bundle redhawksdr


    【解决方案1】:

    在您的 Manifest.MF 中添加 Import-Package 声明

     Import-Package: org.omg.CORBA
    

    【讨论】:

    • 不幸的是,这对我不起作用。当我使用 OSGi 框架运行配置在 Eclipse 中运行它时,它可以正常工作。如果清单不正确,我认为它不会在那里工作。
    【解决方案2】:

    在标准 OSGi 环境中,只有 java.* 包被 OSGi 框架自动导入到包中。所有其他包都需要通过清单中的Import-Package 语句显式导入。

    众所周知,Eclipse/equinox 会将通常随 JRE 提供的类的类解析委托给其调试/运行环境中的标准 VM 类加载器。这意味着如果您在 eclipse 环境之外运行包,您会收到有关缺少导入或某些类未找到异常的投诉。

    解决方案是纠正导入或调整外部环境以使其表现得就像在 eclipse 中运行一样。后者可以通过在配置中添加以下行来完成(即 configuration/config.ini):

    org.osgi.framework.bootdelegation=*
    

    【讨论】:

      猜你喜欢
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      相关资源
      最近更新 更多