亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Maven中出現JAR包沖突如何解決

發布時間:2021-03-03 15:49:08 來源:億速云 閱讀:127 作者:Leah 欄目:開發技術

本篇文章給大家分享的是有關出現Maven JAR包沖突如何解決,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

JAR沖突產生的原因

   Pom.xml
   /  \
  B    C
 / \   / \
 X  Y  X  M

在以上依賴關系中項目除了會引入B、C還會引入X、Y、M的依賴包,但是如果B依賴的X版本會1.0而C依賴的X版本為2.0時,那最后項目使用的到底是X的1.0版本還是2.0版本就無法確定了。這是就要看ClassLoader的加載順序,假設ClassLoader先加載1.0版本那就不會加載2.0版本,反之同理

使用mvn -Dverbose dependency:tree排查沖突

[INFO] +- org.apache.tomcat:tomcat-servlet-api:jar:7.0.70:compile
[INFO] +- org.apache.tomcat:tomcat-jsp-api:jar:7.0.70:compile
[INFO] | +- org.apache.tomcat:tomcat-el-api:jar:7.0.70:compile
[INFO] | \- (org.apache.tomcat:tomcat-servlet-api:jar:7.0.70:compile - omitted for duplicate)
[INFO] +- net.sf.jasperreports:jasperreports:jar:5.6.0:compile
[INFO] | +- (commons-beanutils:commons-beanutils:jar:1.8.0:compile - omitted for conflict with 1.8.3)
[INFO] | +- commons-collections:commons-collections:jar:3.2.1:compile
[INFO] | +- commons-digester:commons-digester:jar:2.1:compile
[INFO] | | +- (commons-beanutils:commons-beanutils:jar:1.8.3:compile - omitted for duplicate)
[INFO] | | \- (commons-logging:commons-logging:jar:1.1.1:compile - omitted for duplicate)

遞歸依賴的關系列的算是比較清楚了,每行都是一個jar包,根據縮進可以看到依賴的關系

  • 最后寫著compile的就是編譯成功的

  • 最后寫著omitted for duplicate的就是有JAR包被重復依賴了,但是JAR包的版本是一樣的

  • 最后寫著omitted for conflict with xx的,說明和別的JAR包版本沖突了,該行的JAR包不會被引入

該命令可配合-Dincludes和-Dexcludes進行使用,只輸出自己感興趣/不感興趣的JAR
參數格式為:[groupId]:[artifactId]:[type]:[version]
每個部分(冒號分割的部分)是支持*通配符的,如果要指定多個格式則可以用,分割,如:

mvn dependency:tree -Dincludes=javax.servlet,org.apache.*

解決沖突,使用exclusion標簽將沖突的JAR排除

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>dubbo</artifactId>
  <version>2.8.3.2</version>
  <exclusions>
    <exclusion>
      <artifactId>guava</artifactId>
      <groupId>com.google.guava</groupId>
    </exclusion>
    <exclusion>
      <artifactId>spring</artifactId>
      <groupId>org.springframework</groupId>
    </exclusion>  
  </exclusions>
</dependency>

解決?了沖突后的樹(解決沖突的策略是:就近原則,即離根近的依賴被采納)

查看運行期類來源的JAR包

有時你以為解決了但是偏偏還是報類包沖突,典型癥狀是java.lang.ClassNotFoundException或Method不兼容等異常,這時你可以設置一個斷點,在斷點處通過下面這個工具類來查看Class所來源的JAR包

public class ClassLocationUtils {
  public static String where(final Class clazz) {
    if (clazz == null) {
      throw new IllegalArgumentException("null input: cls");
    }
    URL result = null;
    final String clazzAsResource = clazz.getName().replace('.', '/').concat(".class");
    final ProtectionDomain protectionDomain = clazz.getProtectionDomain();
    if (protectionDomain != null) {
      final CodeSource codeSource = protectionDomain.getCodeSource();
      if (codeSource != null) result = codeSource.getLocation();
      if (result != null) {
        if ("file".equals(result.getProtocol())) {
          try {
            if (result.toExternalForm().endsWith(".jar") || result.toExternalForm().endsWith(".zip")) {
              result = new URL("jar:".concat(result.toExternalForm()).concat("!/").concat(clazzAsResource));
            } else if (new File(result.getFile()).isDirectory()) {
              result = new URL(result, clazzAsResource);
            }
          } catch (MalformedURLException ignore) {

          }
        }
      }
    }
    if (result == null) {
      final ClassLoader clsLoader = clazz.getClassLoader();
      result = clsLoader != null ? clsLoader.getResource(clazzAsResource) : ClassLoader.getSystemResource(clazzAsResource);
    }
    return result.toString();
  }
}

然后隨便寫一個測試設置好斷點,在執行到斷點出使用ALT+F8動態執行代碼,如

ClassLocationUtils.where(Logger.class)

以上就是出現Maven JAR包沖突如何解決,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西林县| 辽阳县| 旺苍县| 泰安市| 赤水市| 双牌县| 应城市| 广宁县| 延寿县| 旅游| 勐海县| 江川县| 阳谷县| 浦江县| 阳泉市| 海丰县| 松江区| 剑河县| 太湖县| 民勤县| 张家港市| 太白县| 富蕴县| 九江县| 遵义市| 岳普湖县| 陈巴尔虎旗| 古丈县| 九寨沟县| 昌都县| 綦江县| 堆龙德庆县| 琼中| 龙里县| 荣成市| 古田县| 土默特右旗| 安吉县| 靖边县| 遂昌县| 贵州省|