2016-04-26 56 views
2

我有一個劇本的Gradle(編輯剪輯):問題,包括一個罐子到OSGi包

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不提供適當的包 - 清單,我必須把它作爲一個依賴。

產生的罐子結構爲:

/ 
|..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>試圖解決束時發生錯誤groovyecho.jar.20160426-110910406.jar!

org.osgi.framework.BundleException:無法解析groovyecho:包com.gmongo

我在做什麼錯?

UPDATE:

即使我解壓gmongo.jar的類:

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

我得到了同樣的錯誤。

摘要:

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

行之有效的非賈裏德類文件。

,使其處於原始jar文件的工作,我只好也加入

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

回答

3

好清單說com.gmongo必須進口。我懷疑Bundle-Classpath中的jar沒有被分析,看它是否包含這個包。所以你需要指定bundle不需要從嵌入的jar中導入任何需要的包。

Import-Package: !com.gmongo,*

但考慮到你捆綁出口com.mozaiq.echo它採用com.gmongo在其簽名,你應該停止出口進口的那包代替。

-exportcontents: com.gmongo

順便說一句,我不認爲Embed-指令意味着什麼,它使用BND的搖籃OSGi的插件。你可以看到他們只是複製到生成的清單。它們是Maven的Apache Felix maven-bundle-plugin獨有的。

+0

賓果! '!com.gmongo'處理解壓縮的類文件。爲了使它適用於mongo.jar,我必須添加'指令'Bundle-ClassPath','。,gmongo-1.5.jar' – injecteer

+0

Bnd使用'Embed-Dependency'指令來計算您的導入bundle ...所以你不需要在回答中提出的'Import-Package' ...因爲你使用默認的Gradle'osgi'插件,Bnd實際上不會更改jar,只是清單...這就是爲什麼您仍然需要在'jar'塊中添加'from'指令來嵌入jar,並添加'Bundle-ClassPath'指令的原因。如果你想Bnd做到這一點,你可以使用TomDmitriev的其他[Gradle osgi插件](https://github.com/TomDmitriev/gradle-bundle-plugin)。 – Renato

+1

'Embed-Dependency'不是bnd支持的東西。它由Apache Felix maven-bundle-plugin支持。 –