【问题标题】:OSGI application gets NoClassDefFoundError when using Liberty FeatureOSGI 应用程序在使用 Liberty 功能时出现 NoClassDefFoundError
【发布时间】:2013-07-26 20:39:03
【问题描述】:

我有一个从 jar 文件 (testlibrary.jar) 调用代码的 OSGI 包 (awesome.test)。我已将该捆绑包作为 Liberty 功能 (awesome.test.feature) 包含在内,并将它安装在 WebSphere Application Server Liberty Profile V8.5.5 上。我还有一个 OSGI 包 (awesometest),它是 OSGI 应用程序 (awesometest.app) 的一部分,它有一个 Activator 类。

Here is a picture of my workspace setup

我想做的是通过 awesome.test 中的方法调用 testlibrary.jar 中的方法,其中包括 testlibrary.jar 在其构建路径中。我的 awesome.test.feature 可用于在我的 Liberty 服务器上运行的任何应用程序。我希望我的应用程序能够使用该功能通过我在 awesome.test 中提供的功能来访问 testlibrary.jar 中的功能。我不希望 OSGI 应用程序直接从 testlibrary.jar 导入包。

当我在服务器上运行应用程序时,二进制日志中出现以下错误:

CWWKZ0402E: 尝试将应用程序 awesometest.app 安装到 OSGi 框架中时生成了捆绑异常。来自 OSGi 框架的错误文本是:Exception in awesometest.Activator.start() of bundle awesometest。

调试问题发现抛出了这个异常:

java.lang.ClassNotFoundException: testlibrary.test.TestAPI

来自 Awesome.test 中的 TestLibraryRunner.java:

package awesome.test;

import testlibrary.test.TestAPI;

public class TestLibraryRunner { 

    public static void runNonLibTest() {
        System.out.println("No Library code is being called");
    }

    public static void runLibTest() {
        TestAPI ta = new TestAPI("This is a message.");
        ta.display();
    }
}

请注意,从 OSGI 应用程序调用时,runNonLibTest() 将起作用。从 OSGI 应用程序调用 runLibTest 中的 TestAPI 代码会导致上述错误。

来自 Awesometest 中的 Activator.java:

public class Activator implements BundleActivator {

    public void start(BundleContext context) throws Exception {
        System.out.println("Starting...");
        TestLibraryRunner.runNonLibTest();
        TestLibraryRunner.runLibTest();
        System.out.println("Finishing...");
    }

    public void stop(BundleContext context) throws Exception {
        System.out.println("Stopping...");
    }

}

来自 awesometest 中的 MANIFEST.MF:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: awesometest
Bundle-SymbolicName: awesometest
Bundle-Version: 1.0.0
Bundle-Activator: awesometest.Activator
Import-Package: awesome.test,
 org.osgi.framework
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Export-Package: awesometest

总之,我的 OSGI 应用程序无法访问我的 Liberty 功能中包含的包的构建路径中的 jar 中的代码。我在这里缺少一些基本的东西吗?我正在尝试做的事情是否可能?

谢谢

【问题讨论】:

    标签: osgi websphere-liberty


    【解决方案1】:

    在我的教育项目中有相同的运行时异常,我发现的最简单的解决方案是在运行时添加使用的 JAR - 导入包的类路径(在你的情况下是 awesome.test)。

    我希望这个迟到的答案对其他人有所帮助。

    【讨论】:

      【解决方案2】:

      您使用包testlibrary.test,但您没有导入它。您应该将该包添加到捆绑包的 Import-Package 语句中。

      【讨论】:

        【解决方案3】:

        看起来问题出在 awesome.test 的包装上。 awesometest 包(应用程序包)可以很好地找到您的功能代码,但是功能包中会出现问题。您是否确认 testlibrary.jar 已打包在 awesome.test(功能包)中,并且 awesome.test 的清单包含嵌入的 jar?

        您还需要使用 IBM-API-Package 标头在功能清单中列出导出的功能包,但我假设您已经这样做了,否则您的应用程序包激活器将无法看到该功能bundle 的 TestLibraryRunner。

        【讨论】:

          【解决方案4】:

          我的项目的问题是我没有正确包含 testlibrary.jar。虽然它位于 awesome.test 的构建路径中,但它并未包含在 OSGI 功能包中。

          有两种可能的解决方案:

          1.) 在 Eclipse 中,转到 File > Import 并选择 OSGi > Java Archive into an OSGi Bundle 并创建一个新包。这会将 jar 放入它自己的包中,然后 awesome.test 可以从该新包中导入它需要的包。

          2.) 在 Eclipse 中,转到 File > Import 并选择 OSGi > Java Archive into an OSGi Bundle 并将其包含在现有的 bundle 中。这与使 jar 成为自己的包具有相同的效果,但它的模块化程度较低。这种方法的优点是你不能从jar中导出包,只导出你自己的接口。

          还有BND Tool。它可以帮助自动化很多这个过程。我自己没用过。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-04-23
            • 1970-01-01
            • 2021-03-06
            • 1970-01-01
            • 2014-10-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多