OSGI应用程序在使用Liberty功能时获取NoClassDefFoundError

OSGI应用程序在使用Liberty功能时获取NoClassDefFoundError,osgi,websphere-liberty,Osgi,Websphere Liberty,我有一个OSGI包(awesome.test),它从jar文件(testlibrary.jar)调用代码。我已经将该捆绑包作为Liberty特性(awome.test.feature)包括在内,并将其安装在WebSphereApplicationServerLiberty概要文件V8.5.5中。我还有一个OSGI包(awesometest),它是OSGI应用程序(awesometest.app)的一部分,它有一个Activator类 我想做的是通过awesome.test中的方法调用testl

我有一个OSGI包(awesome.test),它从jar文件(testlibrary.jar)调用代码。我已经将该捆绑包作为Liberty特性(awome.test.feature)包括在内,并将其安装在WebSphereApplicationServerLiberty概要文件V8.5.5中。我还有一个OSGI包(awesometest),它是OSGI应用程序(awesometest.app)的一部分,它有一个Activator类

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

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

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

调试问题时发现引发了此异常:

java.lang.ClassNotFoundException:testlibrary.test.TestAPI

来源于awome.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...");
    }

}
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
来自awesometest中MANIFEST.MF的源:

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-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的代码。这里有什么基本的东西我遗漏了吗?我想做的事可能吗


谢谢

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

问题似乎出在awome.test的打包中。awesometestbundle(应用程序bundle)可以很好地找到您的功能代码,但是功能包中会出现问题。您是否确认testlibrary.jar打包在awome.test(功能包)中,awome.test的清单中包含嵌入的jar


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

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

有两种可能的解决方案:

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

2.)在Eclipse中,转到文件>导入,然后选择OSGi>Java Archive to a OSGi Bundle并将其包含在现有Bundle中。这与将jar作为自己的包具有相同的效果,但模块化程度较低。这种方法的优点是,您不能从jar导出包,而只能导出自己的接口


还有一个问题。它可以帮助实现这一过程的自动化。我自己没用过

在我的教育项目中有相同的运行时异常,我找到的最简单的解决方案是在导入包的runtime-Classpath下添加使用过的jar(在您的示例中是awesome.test)

我希望这个迟来的回答能帮助其他人