使用Liberty Feature时,OSGI应用程序获取NoClassDefFoundError

时间:2013-07-26 20:39:03

标签: osgi websphere-liberty

我有一个OSGI包(awesome.test),它调用jar文件(testlibrary.jar)中的代码。我已将bundle作为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框架的错误文本是:awesometest.Activator.start()中的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代码将导致上述错误。

来自Activator.java的awesometest来源:

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...");
    }

}

来自MANIFEST.MF的来自awesometest:

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代码。我有什么基本的东西吗?是我试图做的甚至可能吗?

由于

4 个答案:

答案 0 :(得分:1)

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

我希望这个迟到的答案可以帮助别人。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

有两种可能的解决方案:

1。)在Eclipse中,转到文件>导入并选择OSGi>将Java Archive压缩成OSGi Bundle并创建一个新的bundle。这会将jar放在自己的bundle中,然后awesome.test可以从新的bundle中导入它所需的包。

2。)在Eclipse中,转到文件>导入并选择OSGi> Java归档到OSGi Bundle并将其包含在现有捆绑包中。这与使jar自己的捆绑包具有相同的效果,但它的模块化程度较低。这种方法的优点是你不能从jar导出包,只是导出你自己的接口。

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