使用 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