gradle - 将 jar 包含到 OSGi 包中的问题

标签 gradle jar osgi 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 

list 文件:

    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 的类:

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

我遇到了同样的错误。

总结:

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

适用于非 jared 类文件。

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

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

最佳答案

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

导入包:!com.gmongo,*

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

-导出内容:com.gmongo

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

关于gradle - 将 jar 包含到 OSGi 包中的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36861069/

相关文章:

android - Android SDK从23升级到26构建错误

java - 由于 RenderScript,Android 仪器测试失败

java - 如何在不同的计算机上打开导出的.exe Jar文件或RUN.bat文件?

OSGi 事件管理员

java - 是否有更详细或可自定义的 OSGi 命令帮助页面?

java - 将 OSGI 事件标记为已处理

android - Gradle在proguard之后找不到内部类的符号

gradle - 如何在 Kotlin DSL 的脚本插件中包含 Gradle 插件?

java - 服务器启动时在类路径中引导可执行 jar 文件

java - 通过命令行从 Jar 运行 Java 类