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 类。

这是我的工作区设置的图片

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

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

CWWKZ0402E: 尝试将应用程序 awesometest.app 安装到 OSGi 框架中时生成了捆绑异常。OSGi 框架的错误文本是: Exception in awesometest.Activator.start() of bundle 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 代码将导致上述错误。

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

}

来自 awesometest 中的 MANIFEST.MF:

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

4 回答 4

1

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

我希望这个迟到的答案对其他人有所帮助。

于 2014-11-25T23:33:25.923 回答
0

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

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

于 2013-07-27T16:03:26.173 回答
0

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

有两种可能的解决方案:

1.) 在 Eclipse 中,转到 File > Import 并选择 OSGi > Java Archive into an OSGi Bundle 并创建一个新包。这会将 jar 放入它自己的包中,然后 awesome.test 可以从该新包中导入它需要的包。

2.) 在 Eclipse 中,转到 File > Import 并选择 OSGi > Java Archive into an OSGi Bundle 并将其包含在现有的 bundle 中。这与使 jar 成为自己的包具有相同的效果,但它的模块化程度较低。这种方法的优点是你不能从 jar 中导出包,只导出你自己的接口。

还有BND 工具。它可以帮助自动化很多这个过程。我自己没用过。

于 2013-07-30T14:15:14.923 回答
0

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

于 2013-07-26T23:17:54.020 回答