我有一个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代码。我有什么基本的东西吗?是我试图做的甚至可能吗?
由于
答案 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。它可以帮助自动完成很多这个过程。我自己没有用过它。