当前位置: 首页 > 知识库问答 >
问题:

osgi包中的apache ivy和嵌套jar文件

米楷
2023-03-14

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

BundleA导入包“com.mypackage”。

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

为了编译OSGi包并自动解析它们的依赖关系,我使用了ANTIVY。

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

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

    < li >致电ivy:resolve。我可以清楚地看到IVY正确地解析了package“com . my package”。 < li >调用创建编译类路径的ivy:cachepath。 < li >用classpathref = " compile . class path " 调用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个答案

麹凯捷
2023-03-14

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

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

 类似资料:
  • 如果我有一个OSGI Bundle jar中嵌套了依赖项jar,我是否需要在导入包清单中列出这些类以便使用它们?我不这么认为。 另外,我如何将这些依赖项jar添加到我的包中。我只是把它们放在根文件夹里吗?我是否需要向清单文件添加任何内容才能使用这些依赖关系?

  • 问题内容: 首先,我想创建一个具有以下结构的自定义用户库: src: 库包1 ClassName0.java LibA.pack2 ClassName1.java 我对此没问题。后来我想将此库导入另一个项目并调用 (同时使用pack1和pack2这两个类),由于要求全名,因此将失败,即 如何一次导入整个库以同时使用pack1和pack2这两个类? Ps绝对不是所谓的“嵌套程序包”,但我不知道该如何

  • 我遇到了一个关于OSGI包和“普通”maven jar依赖关系的问题。 A.M是普通的java应用程序,它启动OSGI框架并加载包。 在项目顶层pom(a.pom)中,我定义了一个commons-logging-1.1.1的依赖项,然后在OSGI包a.x中使用commons-logging。maven-bundle-plugin为a.x生成清单,其中包含一个发生“commons-logging”的

  • 以前部署的JDOM的OSGi包究竟是如何解决这些相同的依赖关系的?它们从来没有在捆绑进口包中列出?此外,如果我试图将这些作为项目的依赖项包含并嵌入它们,只会加剧问题。救命啊!