使用Gradle创建具有依赖JAR的Osgi包

使用Gradle创建具有依赖JAR的Osgi包,osgi,gradle,apache-felix,Osgi,Gradle,Apache Felix,我想创建一些依赖于其他(第三方)JAR的捆绑包 (这是否是一个好的做法是另一个话题) 我能够使用gradle生成一个胖jar(它包含所有依赖jar)和osgi清单 我的项目布局存储在libs/文件夹中 制作jar之后,第三方jar(例如ibm.jar)位于jar的根目录中 我的gradle任务是使用osgi插件和一些基本的osgi指令,我只手动指定了导出包作为我的程序包,但没有指定其他3个JAR 然而,当我尝试安装该捆绑包时,它显示错误 Error starting file:****.jar

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

我能够使用gradle生成一个胖jar(它包含所有依赖jar)和osgi清单

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

我的gradle任务是使用osgi插件和一些基本的osgi指令,我只手动指定了导出包作为我的程序包,但没有指定其他3个JAR

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

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的问题

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

Bundle-ClassPath: '.,*.jar' 
我可以看到我需要的包(com.ibm.mq)在导入包中: 对吗

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

编辑: 用我这样的毕业指导,我也会犯同样的错误 (我也检查了清单中出现的bundle类路径)


Bnd对目录或文件不使用通配符(有充分的理由)。如果需要对文件进行通配符扩展,请使用${lsa;(dir);(match)}宏。有关详细信息,请访问www.aquet.biz/Bnd。

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