2013-07-26 36 views
0

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

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的awesometest.Activator.start()中的异常。

调试问题,发现此异常被抛出:

抛出java.lang.ClassNotFoundException:从TestLibraryRunner.java在awesome.test testlibrary.test.TestAPI

来源:

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

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

} 

来源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功能中。我在这里错过了一些基本的东西吗?我试图做甚至可能吗?

感谢

回答

0

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

有两种可能的解决方案:

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

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

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

0

您使用打包testlibrary.test,但你不导入。您应该将该软件包添加到该软件包的Import-Package声明中。

0

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

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

1

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

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

相关问题