apache常春藤和osgi包中的嵌套jar文件

时间:2014-03-06 09:52:01

标签: java ant osgi bundle ivy

我们使用OSGi包有以下场景:

BundleA导入包“com.mypackage”。

BundleB导出包“com.mypackage”,但该包来自添加到BundleB类路径的嵌套JAR文件。

为了编译OSGi包并自动解决它们的依赖关系,我使用的是ANT + IVY。

我配置了一个ivy:buildobr任务,它正确构建了OBR文件(手动检查)。

接下来,我配置了实际的构建任务。

  1. 致电常春藤:解决。我可以清楚地看到IVY正确解析了包“com.mypackage”。
  2. 调用ivy:创建编译类路径的cachepath。
  3. 使用classpathref =“compile.classpath”
  4. 调用javac

    javac抛出错误,因为它不知道包“com.mypackage”。它只知道指示JAR文件的类路径,并且不知道如何用它自己的类路径解释MANIFEST.MF。

    问题在于构造的类路径。它不知道从BundleB中的嵌套JAR导出的“com.mypackage”。

    你如何解决这类问题?

    Manifest-Version: 1.0
    Bundle-ManifestVersion: 2
    Bundle-Name: BundleA
    Bundle-SymbolicName: BundleA
    Bundle-Version: 1.0.0.qualifier
    Bundle-RequiredExecutionEnvironment: JavaSE-1.6
    Import-Package: com.mypackage,
     org.osgi.framework;version="1.3.0"
    Bundle-ClassPath: .
    
    
    Manifest-Version: 1.0
    Bundle-ManifestVersion: 2
    Bundle-Name: BundleB
    Bundle-SymbolicName: BundleB
    Bundle-Version: 1.0.0.qualifier
    Bundle-RequiredExecutionEnvironment: JavaSE-1.6
    Import-Package: org.osgi.framework;version="1.3.0"
    Export-Package: com.mypackage
    Bundle-ClassPath: .,
    nestedJarContainingComMypackage.jar
    

    由于

1 个答案:

答案 0 :(得分:5)

你不能这样做。 javac编译器根本不理解嵌套在JAR中的JAR。这是OSGi框架的运行时功能。

要针对这些API进行构建,您必须提取内部JAR并将其放入构建时类路径中。但是,您仍然可以在运行时以您希望的方式使用嵌套JAR。