簡體   English   中英

OSGi:javax.annotation 沖突:Java SE 與 Java EE

[英]OSGi: javax.annotation conflict: Java SE vs Java EE

在 Java SE OSGi (Apache Felix) 環境中,我嘗試使用 PAX CDI 和 Weld 2.2.6.Final 集成 CDI。

我目前收到以下錯誤:

ERROR: Bundle org.jboss.weld.osgi-bundle [45] Error starting file:///someDir/org/jboss/weld/weld-osgi-bundle/2.2.6.Final/weld-osgi-bundle-2.2.6.Final.jar (org.osgi.framework.BundleException: Uses constraint violation. Unable to resolve bundle revision org.jboss.weld.osgi-bundle [45.0] because it is exposed to package 'javax.annotation' from bundle revisions org.jboss.spec.javax.annotation.jboss-annotations-api_1.2_spec [39.0] and org.apache.felix.framework [0] via two dependency chains.

Chain 1:
  org.jboss.weld.osgi-bundle [45.0]
    import: (&(osgi.wiring.package=javax.annotation)(version>=1.1.0))
     |
    export: osgi.wiring.package=javax.annotation
  org.jboss.spec.javax.annotation.jboss-annotations-api_1.2_spec [39.0]

Chain 2:
  org.jboss.weld.osgi-bundle [45.0]
    import: (&(osgi.wiring.package=com.google.common.util.concurrent)(version>=13.0.0))
     |
    export: osgi.wiring.package=com.google.common.util.concurrent; uses:=javax.annotation
  com.google.guava [1.0]
    import: (osgi.wiring.package=javax.annotation)
     |
    export: osgi.wiring.package=javax.annotation
  org.apache.felix.framework [0])

我認為這是因為 Java SE (v8) 已經定義了一個包“javax.annotation”,但 Java EE (v7) 指定了具有更多注釋的相同包。

但是,“javax.annotation”已經由系統包 (org.apache.felix:org.apache.felix.framework:jar:4.2.1) 作為系統包導出。

在這種情況下,讓 OSGi 從 Java EE 中選擇一個的正確方法是什么?

編輯

  1. 只添加JDK中真正需要的系統包

    在這種情況下這是不可能的,因為我正在編寫一個框架,而不是一個應用程序( Drombler FX )。

  2. 從 default.properties 中的 org.osgi.framework.system.packages 系統屬性中排除 javax.annotations

    實際上,我已經嘗試過了,因為無論如何我在框架中都有 default.properties 的副本。 它起作用了,但它看起來更像是一種黑客行為,並且在我需要升級此文件時增加了維護工作。 此外,如果 Maven Bundle Plugin 在編譯時檢查導出的包(我很歡迎),當人們想要使用 javax.annotations 時,他們將不得不開始向他們的項目添加額外的依賴項,因為該包將被系統導出包了。 我希望找到更好的解決方案。

  3. 使用認可的機制

    到目前為止,這看起來是最干凈的解決方案,但我仍然希望我可以避免這種情況,因為它增加了應用程序打包的復雜性。

現在,我剛剛查看了 Java SE 8 文檔,很驚訝 JSR 250 不再被列為認可技術!??? 它在 Java SE 7 中被列為認可技術。他們是否真的刪除了 Java SE 8 中對 JSR 250 的認可支持,還是文檔不正確?

Java SE 8: https : //docs.oracle.com/javase/8/docs/technotes/guides/standards/

Java SE 7: https : //docs.oracle.com/javase/7/docs/technotes/guides/standards/

如果 Java SE 8 仍然支持它,您如何看待這種方法?

還有其他方法嗎?

Java 的一大問題是,越來越多的包被放入 JDK,這些包應該是具有自己版本控制生命周期的獨立項目。 這不會在整體項目中引起問題,但會在 OSGi 中造成痛苦。

這就是為什么我們只從 JDK 中添加真正需要的系統包,並從 bundle 中獲取所有內容。 您會驚訝於您實際上需要從 JDK 獲得多少包。

如果有一個 org.osgi.framework.system.packages.exclude 系統屬性,但遺憾的是它不存在,可以快速修復。

一個緩慢的解決方案是,如果您指定沒有包的org.osgi.framework.system.packages並且您會一一找到您實際需要的包。 您會驚訝地發現您需要的包裹少了。

一個更快的更骯臟的解決方案是,如果你進入felix.jar,發現default.properties並復制出org.osgi.framework.system.packages系統屬性的內容與javax.annotation中排除。*類。 當您意識到javax.transaction.*包會遇到同樣的問題時,您將需要從包中獲取javax.sql.*包...

遺憾的是,在 felix 中,您還必須在系統包列表中列出 osgi-core 包。 使用 Equinox,不必列出這些包(我認為這很好,因為 osgi-core 包不應該是系統包配置的一部分)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM