【问题标题】:Problems including a jar into an OSGi bundle将 jar 包含到 OSGi 包中的问题
【发布时间】:2016-08-20 01:17:40
【问题描述】:

我有一个 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 没有提供适当的捆绑清单,我必须将其作为依赖项包含在内。

生成的jar结构是:

/
|..com/
|..META-INF/
|..gmongo-1.5.jar 

清单.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 错误 > 尝试解析捆绑包 groovyecho.jar.20160426-110910406.jar 时出错!

org.osgi.framework.BundleException: 无法解析 groovyecho : package com.gmongo

我做错了什么?

更新:

即使我解压gmongo.jar 的类:

jar {
  ....
  from {
    zipTree configurations.compile.find{ !it.directory && it.name.startsWith( 'gmongo' ) }
  }
}

我遇到了同样的错误。

总结:

instruction 'Import-Package', '!com.gmongo,*'

适用于 un-jared 类文件。

为了让它在原始 jar 文件上工作,我还必须添加

instruction 'Bundle-ClassPath', '.,gmongo-1.5.jar'

【问题讨论】:

    标签: gradle jar osgi osgi-bundle


    【解决方案1】:

    清单上说必须导入 com.gmongo。我怀疑 Bundle-Classpath 中的 jar 没有被分析以查看它是否包含该包。因此,您需要指定捆绑包不需要从该嵌入式 jar 导入任何所需的包。

    Import-Package: !com.gmongo,*

    但鉴于您捆绑了在其签名中使用 com.gmongo 的导出 com.mozaiq.echo,您可能应该导出该包而不是停止导入。

    -exportcontents: com.gmongo

    顺便说一句,我认为Embed- 指令对使用 bnd 的 Gradle OSGi 插件没有任何意义。您可以看到它们只是被复制到生成的清单中。它们是 Apache Felix maven-bundle-plugin for Maven 独有的。

    【讨论】:

    • 宾果游戏! !com.gmongo 处理解压缩的类文件。为了使它适用于 mongo.jar,我必须添加 instruction 'Bundle-ClassPath', '.,gmongo-1.5.jar'
    • Bnd 使用Embed-Dependency 指令来计算捆绑包的导入...所以您不需要答案中建议的Import-Package... 因为您正在使用默认 Gradle osgi 插件,Bnd 实际上不会更改 jar,只是清单...这就是为什么您仍然需要在 jar 块中添加 from 指令以嵌入 jar,并添加 Bundle-ClassPath指令也是如此。如果你想让 Bnd 这样做,你可以使用 TomDmitriev 的另一个 Gradle osgi plugin
    • Embed-Dependency 不受 bnd 支持。它由 Apache Felix maven-bundle-plugin 支持。
    猜你喜欢
    • 2013-06-29
    • 2012-10-30
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 2017-06-05
    • 2015-10-14
    相关资源
    最近更新 更多