OSGI应用程序在使用Liberty功能时获取NoClassDefFoundError
我有一个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: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
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)
我希望这个迟来的回答能帮助其他人