我们使用OSGi包有以下场景:
BundleA导入包“com.mypackage”。
BundleB导出包“com.mypackage”,但该包来自添加到BundleB类路径的嵌套JAR文件。
为了编译OSGi包并自动解决它们的依赖关系,我使用的是ANT + IVY。
我配置了一个ivy:buildobr任务,它正确构建了OBR文件(手动检查)。
接下来,我配置了实际的构建任务。
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
由于
答案 0 :(得分:5)
你不能这样做。 javac编译器根本不理解嵌套在JAR中的JAR。这是OSGi框架的运行时功能。
要针对这些API进行构建,您必须提取内部JAR并将其放入构建时类路径中。但是,您仍然可以在运行时以您希望的方式使用嵌套JAR。