2017-02-28 95 views
3

我們有一個項目取決於Aspose Words的com.aspose:aspose-words:16.10.0:jdk16如何解決Maven/Gradle中幾個級別間接缺失的依賴項地獄?

POM爲aspose-words聲明沒有依賴關係,但事實證明這是一個謊言。它實際上使用jai-core,其最新版本是javax.media:jai-core:1.1.3

雖然jai-core的POM也存在 - 它聲明不依賴,但實際上取決於jai-codec,它在com.sun.media:jai-codec:1.1.3

獲得這些項目來修復事情似乎不切實際。 JAI基本上是一個死的項目,Maven Central不知道誰加了POM,所以沒有人負責修復元數據。 Aspose拒絕在沒有測試的情況下修復它,即使你可以向他們顯示他們自己的代碼做錯了,即使他們修復了它,他們也會在jai-core:1.1.3上增加依賴,這隻能解決一半的問題。

如果我看看我們的整個依賴關係樹,這只是問題的一個例子。其他人正在潛伏,被其他依賴鏈所掩蓋,恰巧拉入了缺失的依賴關係。在某些情況下,我們甚至會向項目報告POM問題,但他們只是說他們的依賴「不是真實的」,儘管他們的類明確提到了另一個庫中的類。

我能想到的幾個同樣尷尬的選擇:

  • 創建jai-core:1.1.3.1aspose-words:16.10.0.1,並解決他們的POM包括缺少的相關性,但誰在未來的更新他們會做同樣的事情。另外,任何其他庫我不知道哪些恰好取決於jai-core也必須更新。
  • 從我們自己的項目中添加依賴項,儘管它確實不是一個項目。
  • 編輯現在有的版本的POM直接解決問題,只是告誡人們可能緩存了錯誤的版本。

所以我想我有這個兩個相關的問題:

  • 是否有解決這個不正確方式?看起來任何非玩具項目最終都會遇到這個問題,所以沒有一個明顯正確的方法來解決這個問題令人擔憂。
  • 有沒有辦法阻止不正確的依賴關係元數據進入工件服務器?因爲團隊中的其他開發人員正在添加依賴關係而沒有正確檢查事情,因此當一年後發生一些事情時,我會留下來清理它們的錯誤。
+2

如果使用特定的依賴關係,您可以使用Enforcer插件來失敗構建...但每個庫都由其團隊維護..如果他們拒絕修復事情,然後把它叉起來並自己修復是最好的選擇。這確實意味着你必須以常規的方式將原創新增加的內容合併到你自己的分支中。但是,如果它已經死了......不會有任何東西。但Aspose不是我認爲的開源軟件?所以可能會有許可問題。另一種解決方案是:創建一個包裝器POM,依賴於Aspose和它需要的每個庫,然後依賴這個包裝器POM。 – Tunaki

+0

請閱讀[Aspose.Words附加依賴關係](https://docs.aspose.com/display/wordsjava/System+Requirements#SystemRequirements-AdditionalDependencies)。你能分享你的用例的完整細節嗎?然後我會爲您提供有關您的查詢的更多信息。我與開發者傳道者一起工作。 –

+0

@TahirManzoor在這種特殊情況下,我們使用Aspose將DOC轉換爲PDF。一個DOC碰巧包含BMP,由於某種原因,Aspose使用JAI來讀取BMP。這似乎是一個遺留問題,因爲我無法獲得Word的現代版本來創建此類文檔,所以我正在等待有關哪個版本的Word創建它的更多信息,以便我可以挖掘該版本的VM並嘗試製作測試文件。 – Trejkaz

回答

1

Tunaki已經給出了很多好的方法。讓我補充以下內容:

我們不得不處理很多傳統的罐子,這些罐子是MavenCentral上已有的罐子的一些舊的或奇怪的版本。我們給了他們一個特殊的版本號(如1.2.3-companyname),併爲他們創建了符合我們目的的POM。這是 - 或多或少 - 你的第一個「尷尬選擇」。這就是我想爲你處理的事情;此外,我會在dependencyManagement中定義版本,以便Maven依賴關係調解不會將其設置爲其他版本。

如果你的jar的新版本出現了,你可以檢查它是否仍然存在相同的問題(如果他們做了正確的Maven構建,他們應該擁有POM內的所有依賴關係)。如果是這樣,你需要再次修復它。

我不會更改已有版本的poms,因爲它會讓人感到困惑,並且可能會導致不一致性問題,因爲如果舊版本已經存在於本地存儲庫中,Maven將無法獲取新的POM。如果只有很少的項目需要管理,以便您仍然可以看到正在發生的事情(對POM中的依賴關係進行適當評論可以使其更清晰),那麼將依賴項添加到您自己的項目中是一種選擇。

-1

JAI對於Aspose.Words for Java是可選的。 Aspose.Words for Java只有在可用時才使用JAI圖像編碼器和解碼器。如果沒有JAI,它就可以正常工作。

該編解碼器補充了標準的java ImageIO編碼器/解碼器。最顯着的補充是Tiff的支持。

JAI(Java Advanced Imaging)不是通常的庫。首先 - 它是本地圖書館。即它爲不同的平臺分配分配。它也具有「便攜式」純Java分發功能,但如果您想要JAI的全部功能 - 您應該堅持原生選項。

另一件事:通常你應該在主機系統上運行JAI本地分佈式安裝。即它像桌面應用程序一樣安裝,不像通常的java庫。同樣,JAI編解碼器的行爲不像通常的庫:如果它安裝在系統上 - 它將插入ImageIO,與類路徑無關。

所以,我不知道使用Maven安裝JAI的好方法 - 就像使用Maven安裝Skype或任何其他桌面應用程序一樣。但它是恕我直言,我不是Maven的偉大專家:)

+0

在這種特殊情況下,它使用JAI來讀取BMP,因爲文檔碰巧包含一個。如果您沒有JAI,則嘗試將這樣的文檔保存爲PDF時會失敗。所以「它會工作正常」有點讓人誤解......如果你碰巧遇到一個帶有BMP的文檔,它只會起作用。而且您無法預先知道您收到的文件是否會觸發該問題。 – Trejkaz

+0

它是否插入「紅十字」圖像而不是不支持/破碎的圖像?如果是 - 沒關係。無論如何,你最好在Aspose.Words支持論壇https://www.aspose.com/community/forums/aspose.words-product-family/75/showforum.aspx上提出你的問題。可能是你的系統可以加載你的類型的BMP沒有JAI - 在這種情況下,它是一個錯誤。 –

+0

它根本不會生成PDF,因爲你失敗了。我們已經在論壇上發帖了,但他們要求提供一個樣本。沒有人會給我們一個樣本,Aspose本身也不能用於創建一個帶有BMP的文檔,因爲它們會自動將其轉換爲PNG。 – Trejkaz