簡體   English   中英

如何處理胖jar依賴

[英]How to deal with fat jar dependency

我有一個我在項目中使用的專有依賴項,我無法拒絕。 它建在一個大胖子罐子里,里面收集了所有依賴的包裹。 我的意思是甚至像slf4j-api,apache-commons,javax包等常見的那些。

將它與我自己的聲明的dependecies列表一起使用是有風險的,因為在類加載器中總是會首先加載哪個類 - 在fat jar中我的或者過時的類。

我想知道有沒有解決這個問題的方法? 如何治療這種肥胖的罐子? 我正在使用maven進行依賴管理。

在Maven中,您在POM中定義依賴關系的順序非常重要。 如果按正確順序列出它們,則應按順序將它們添加到jar中,並且文件中的哪個類更高,這是首先加載的類。

如果您將從多個罐子中組合運行時類路徑,那么再次,這是將罐子按正確的順序排列的問題。

我認為還有另一種方式。 我可以將這個庫jar包裝在自己的自定義類加載器中

URLClassLoader c1 = new URLClassLoader(new Url[] { new URL("file:lib/fatJarDep.jar"});

並創建一個工廠,使用這個獨立的類加載器實例化該庫的類

Class.forName("className", true, c1);

如果jar內部提取了所有依賴類,則無法將它們從類加載中排除,因此項目中的相同依賴性可能會發生沖突。

您應該編輯胖罐並手動刪除類以生成輕型版本,然后將其安裝在您的倉庫中並在您的pom中引用它。

如果您知道胖jar的某些功能在您排除某些依賴項時有用,或者您想自己包含它們,則可以嘗試這樣做:

  1. 制作一個僅依賴於胖罐的maven項目
  2. 使用maven-shade-plugin ,特別是它的重定位功能來排除你不想要的包,或者只是將所有jar的類重新定位到另一個包中,從而將它們移開。
  3. 在您的其他項目中使用項目的工件而不是胖的專用jar。

暫無
暫無

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

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