将 jar 包含到 OSGi 包中的问题
Problems including a jar into an OSGi bundle
我有一个 gradle 脚本(编辑剪辑):
apply plugin:'osgi'
apply plugin:'eclipse'
apply plugin:'groovy'
....
dependencies {
....
compile 'org.codehaus.groovy:groovy-all:2.4.4'
compile 'com.gmongo:gmongo:1.5'
}
jar {
manifest {
....
instruction 'Embed-Dependency', '*;scope=compile|runtime'
instruction 'Embed-Transitive', 'true'
instruction 'Bundle-ClassPath', '.,gmongo-1.5.jar'
}
from {
configurations.compile.findAll{ !it.directory && it.name.startsWith( 'gmongo' ) }
}
}
只要 gmongo
没有提供合适的 bundle-manifest,我就必须将其作为依赖项包含进来。
生成的 jar 结构是:
/
|..com/
|..META-INF/
|..gmongo-1.5.jar
MANIFEST.INF:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bnd-LastModified: 1461227335334
Bundle-ActivationPolicy: lazy
Embed-Dependency: *;scope=compile|runtime
Import-Package: com.gmongo,com.mongodb;version="[3.2,4)",groovy.lang;v
ersion="[2.4,3)",....."
Tool: Bnd-2.1.0.20130426-122213
Export-Package: com.mozaiq.echo;version="1.0.0";uses:="com.gmongo,groo
vy.lang,javax.servlet,javax.servlet.http,org.osgi.framework"
Bundle-ClassPath: .,gmongo-1.5.jar
Embed-Transitive: true
Created-By: 1.8.0_72 (Oracle Corporation)
安装后我得到
0 ERROR > Error occurred while trying to resolve bundle groovyecho.jar.20160426-110910406.jar!
org.osgi.framework.BundleException: Can't resolve groovyecho : package com.gmongo
我做错了什么?
更新:
即使我解压 gmongo.jar
的 classes:
jar {
....
from {
zipTree configurations.compile.find{ !it.directory && it.name.startsWith( 'gmongo' ) }
}
}
我遇到了同样的错误。
摘要:
instruction 'Import-Package', '!com.gmongo,*'
适用于非 jared class 文件。
为了让它在原始 jar 文件上工作,我还必须添加
instruction 'Bundle-ClassPath', '.,gmongo-1.5.jar'
好吧,清单上说 com.gmongo 必须导入。我怀疑 Bundle-Classpath 中的 jar 没有被分析以查看它是否包含该包。所以你需要指定 bundle 不需要从那个嵌入式 jar 导入任何需要的包。
Import-Package: !com.gmongo,*
但鉴于您捆绑了在其签名中使用 com.gmongo 的导出 com.mozaiq.echo,您可能应该导出该包而不是停止导入。
-exportcontents: com.gmongo
顺便说一句,我认为 Embed-
指令对使用 bnd 的 Gradle OSGi 插件没有任何意义。您可以看到它们只是被复制到生成的清单中。它们对于 Maven 的 Apache Felix maven-bundle-plugin 是独一无二的。
我有一个 gradle 脚本(编辑剪辑):
apply plugin:'osgi'
apply plugin:'eclipse'
apply plugin:'groovy'
....
dependencies {
....
compile 'org.codehaus.groovy:groovy-all:2.4.4'
compile 'com.gmongo:gmongo:1.5'
}
jar {
manifest {
....
instruction 'Embed-Dependency', '*;scope=compile|runtime'
instruction 'Embed-Transitive', 'true'
instruction 'Bundle-ClassPath', '.,gmongo-1.5.jar'
}
from {
configurations.compile.findAll{ !it.directory && it.name.startsWith( 'gmongo' ) }
}
}
只要 gmongo
没有提供合适的 bundle-manifest,我就必须将其作为依赖项包含进来。
生成的 jar 结构是:
/
|..com/
|..META-INF/
|..gmongo-1.5.jar
MANIFEST.INF:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bnd-LastModified: 1461227335334
Bundle-ActivationPolicy: lazy
Embed-Dependency: *;scope=compile|runtime
Import-Package: com.gmongo,com.mongodb;version="[3.2,4)",groovy.lang;v
ersion="[2.4,3)",....."
Tool: Bnd-2.1.0.20130426-122213
Export-Package: com.mozaiq.echo;version="1.0.0";uses:="com.gmongo,groo
vy.lang,javax.servlet,javax.servlet.http,org.osgi.framework"
Bundle-ClassPath: .,gmongo-1.5.jar
Embed-Transitive: true
Created-By: 1.8.0_72 (Oracle Corporation)
安装后我得到
0 ERROR > Error occurred while trying to resolve bundle groovyecho.jar.20160426-110910406.jar!
org.osgi.framework.BundleException: Can't resolve groovyecho : package com.gmongo
我做错了什么?
更新:
即使我解压 gmongo.jar
的 classes:
jar {
....
from {
zipTree configurations.compile.find{ !it.directory && it.name.startsWith( 'gmongo' ) }
}
}
我遇到了同样的错误。
摘要:
instruction 'Import-Package', '!com.gmongo,*'
适用于非 jared class 文件。
为了让它在原始 jar 文件上工作,我还必须添加
instruction 'Bundle-ClassPath', '.,gmongo-1.5.jar'
好吧,清单上说 com.gmongo 必须导入。我怀疑 Bundle-Classpath 中的 jar 没有被分析以查看它是否包含该包。所以你需要指定 bundle 不需要从那个嵌入式 jar 导入任何需要的包。
Import-Package: !com.gmongo,*
但鉴于您捆绑了在其签名中使用 com.gmongo 的导出 com.mozaiq.echo,您可能应该导出该包而不是停止导入。
-exportcontents: com.gmongo
顺便说一句,我认为 Embed-
指令对使用 bnd 的 Gradle OSGi 插件没有任何意义。您可以看到它们只是被复制到生成的清单中。它们对于 Maven 的 Apache Felix maven-bundle-plugin 是独一无二的。