使用 Gradle 创建带有依赖 Jar 的 Osgi Bundle

Posted

技术标签:

【中文标题】使用 Gradle 创建带有依赖 Jar 的 Osgi Bundle【英文标题】:Creating Osgi Bundle with dependent Jars using Gradle 【发布时间】:2012-10-18 02:55:57 【问题描述】:

我想创建一些依赖于其他(第 3 方)jar 的包 (这是否是一个好的做法是另一个话题)

我可以使用 gradle 生成一个 fat jar(它有所有依赖的 jars)和 osgi manifest

我的项目布局存储 jar 在 libs/ 文件夹中 制作 jar 后,第 3 方 jar(例如 ibm.jar)位于 jar 的根目录中。

我将我的 gradle 任务是使用带有一些基本 osgi 指令的 osgi 插件,我仅将导出包指定为我的程序的包手动,而不是其他 3 个 jars

但是,当我尝试安装该捆绑包时,它显示错误

Error starting file:****.jar (org.osgi.framework.BundleException: Unresol
ved constraint in bundle ***** [24]: Unable to resolve 24.0: missi
ng requirement [24.0] osgi.wiring.package; (osgi.wiring.package=com.ibm.mq))
org.osgi.framework.BundleException: Unresolved constraint in bundle **** [24]: Unable to resolve 24.0: missing requirement [24.0] osgi.wiring.package; (osgi.wiring.package=com.ibm.mq)
        at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:382
6)
        at org.apache.felix.framework.Felix.startBundle(Felix.java:1868)
        at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1191)

        at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStart
LevelImpl.java:295)
        at java.lang.Thread.run(Unknown Source)

分级

task makeJar(type: Jar) 

from  'libs/'
manifest = osgiManifest 
        classesDir = sourceSets.main.output.classesDir
        classpath = sourceSets.main.runtimeClasspath
        instruction 'Export-Package','abc.def'  
        instruction 'Bundle-Vendor', 'ABC'
        instruction 'Bundle-Activator', 'abc.def.Activator'
        instruction 'Bundle-ClassPath', '.,*.jar'
        instruction 'Include-Resource', '@**/*.jar'
    

我在下面尝试过,但它不起作用,似乎是 gradle 的问题http://issues.gradle.org/browse/GRADLE-1107

'Include-Resource', 'libs/'

我试图在类路径中明确设置它们,但问题仍然存在

Bundle-ClassPath: '.,*.jar' 

我可以看到我需要的包 (com.ibm.mq) 在 Import-Package 中: 对吗?

我的问题是: 什么应该是正确的清单? gradle(基于 BND)能否理解依赖关系并自动创建清单,如果可以,需要什么设置?

编辑: 有了这样的gradle insturction,我遇到了同样的错误 (我也检查了清单中出现的捆绑类路径)

instruction 'Bundle-ClassPath', """.,felix.jar,org.springframework.aop-3.0.5.RELEASE.jar,org.springframework.asm-3.0.5.RELEASE.jar,c3p0-0.9.1.2.jar,com.springsource.net.sf.cglib-2.2.0.jar,org.springframework.context-3.0.5.RELEASE.jar,org.springframework.transaction-3.0.5.RELEASE.jar,com.ibm.mqjms.jar,org.springframework.beans-3.0.5.RELEASE.jar,org.springframework.core-3.0.5.RELEASE.jar,commons-io-1.4.jar,org.springframework.expression-3.0.5.RELEASE.jar,ojdbc14.jar,org.springframework.jdbc-3.0.5.RELEASE.jar,connector.jar,commons-lang-2.4.jar,commons-logging.jar,com.ibm.mq.jar,log4j-1.2.15.jar,org.springframework.web-3.0.5.RELEASE.jar"""

【问题讨论】:

【参考方案1】:

Bnd 不对目录或文件使用通配符(有充分的理由)。如果您需要对文件进行通配符扩展,请使用 $lsa;(dir);(match) 宏。详情请见 www.aqute.biz/Bnd。

【讨论】:

非常感谢您的回答。我尝试了该选项,但似乎 gradle 生成的结果清单没有处理宏并将其 $lsa;libs;*.jar 放在那里。我试图“硬编码”捆绑类路径,结果清单以'.,com.ibm.jar,b.jar,c.jar'等方式包含每个jar。但是我仍然遇到同样的错误。是否与“包含包”相关,仍然包含 com.ibm.mq。应该是这样吗?我不确定 gradle-bnd 如何确定这个“包含包”。谢谢! 我不知道 Gradle 在做什么,但像 @**/*.jar 这样的东西在 bnd 中不起作用。 1) 清单现在看起来如何 2) 罐子在捆绑包中吗?

以上是关于使用 Gradle 创建带有依赖 Jar 的 Osgi Bundle的主要内容,如果未能解决你的问题,请参考以下文章

从 Gradle 创建可执行 jar 文件并在 maven 中导入 jar

如何使用 Gradle 创建具有实现依赖项的可执行胖 jar

使用 Gradle 为带有 JSP 页面的 Spring Boot 应用程序创建 Jar

gradle使用本地jar包

由于 pom 依赖,无法创建我的 JDA 项目的 JAR

如何在 Gradle 中使用带有混淆 jar 的 Launch4J