Search code examples
osgigradleapache-felix

Creating Osgi Bundle with dependent Jars using Gradle


I would like to create some bundles which dependent on some other (3rd party) jars (whether this is a good practice is another topic)

I am able to use gradle to generate a fat jar (which has all dependent jars) and the osgi manifest

My project Layout store jars in the libs/ folder After making the jar, 3rd party jars (e.g. ibm.jar) are in the root of the jar.

I will My gradle task is using the osgi plugin with some basic osgi instruction, I specified only the export package as my program's package manually, but not other 3 jars

However, when I try to install that bundle it shows error

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)

Gradle

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'
    }
}

I tried with below but it wont work, seems an issue of gradle http://issues.gradle.org/browse/GRADLE-1107

'Include-Resource', 'libs/'

I tried to explicity set them in classpath, but problem persist

Bundle-ClassPath: '.,*.jar' 

I can see the package I need (com.ibm.mq) is in Import-Package: is that correct?

My question is : what should be the correct manifest? Can the gradle (based on BND) understand the dependencies and automatically create the manifest, if so what is the required setup?

EDIT: With my gradle insturction like this, i am getting same error (I checked the bundle Class path appear in the manifest as well)

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"""

Solution

  • Bnd does not use wild cards for directories or files (for good reasons). If you need wildcard expansion on files, use the ${lsa;(dir);(match)} macro. See www.aqute.biz/Bnd for details.