IDEA中解決maven包衝突問題

使用maven構建項目時,如果項目中有log4j的依賴,在運行程序時可能會出現在同一個類中log4j-over-slf4j.jar和 slf4j-log4j12.jar衝突的問題:

錯誤原因:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at org.apache.log4j.LogManager.getLogger(LogManager.java:44)
    at org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:66)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:270)
    at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:155)
    at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:132)
    at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:657)
    at org.apache.hadoop.conf.Configuration.<clinit>(Configuration.java:173)

Caused by: java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError. See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details.
    at org.apache.log4j.Log4jLoggerFactory.<clinit>(Log4jLoggerFactory.java:49)
    ... 8 more

原因是:log4j-over-slf4j和slf4j-log4j12是跟Java日誌系統相關的兩個jar包,當它們同時出現在classpath下時,就可能會引起堆棧溢出異常。
解決辦法:pom.xml文件中,在使用到的依賴包中添加<exclusion>標籤將slf4j-log4j12.jar排除即可,但是我們一個一個找到排除會很麻煩,所以我們使用IDEA插件Maven Helper解決這個問題,就會方便更多。

點擊Install

然後重新啓動IDEA,安裝完成後,在 pom 文件下方會出現這個東西,然後點擊這個,

接下來到重點了,選中衝突選項 conflicts,這一列都是存在衝突的包,

我然後根據衝突的包把它排除掉,當然我們調錯誤的時候也可以直接搜索有問題的包我出現的那個錯誤:log4j-over-slf4j.jar,我已經排除掉了。這裏我以lombok爲例

選中右鍵就可以 Exclude 啦,想用1.16.12就把其他版本的Exclude掉,想用0.11.6就把其他版本的Exclude掉,是不是很方便。

 

面對衆多的依賴,有一種方法不用考慮依賴路徑、聲明優化等因素可以採用直接鎖定版本的方法確定依賴構件的版本,版本鎖定後則不考慮依賴的聲明順序或依賴的路徑,以鎖定的版本的爲準添加到工程中,此方法在企業開發中常用。

如下的配置是鎖定了spring-beans和spring-context的版本
 

<dependencyManagement>
    <dependencies>
        <!--這裏鎖定版本爲4.2.4 -->
  		<dependency>
  			<groupId>org.springframework</groupId>
  			<artifactId>spring-beans</artifactId>
  			<version>4.2.4.RELEASE</version>
  		</dependency>
		<dependency>
  			<groupId>org.springframework</groupId>
  			<artifactId>spring-context</artifactId>
  			<version>4.2.4.RELEASE</version>
  		</dependency>
    </dependencies>
</dependencyManagement>

注意:在工程中鎖定依賴的版本並不代表在工程中添加了依賴,如果工程需要添加鎖定版本的依賴則需要單獨添加<dependencies></dependencies>標籤,如下:

<dependencies>
  		<!--這裏是添加依賴 -->
  		<dependency>
  			<groupId>org.springframework</groupId>
  			<artifactId>spring-beans</artifactId>
 		</dependency>
		<dependency>
  			<groupId>org.springframework</groupId>
  			<artifactId>spring-context</artifactId>
 		</dependency>
  	</dependencies>

上邊添加的依賴並沒有指定版本,原因是已在<dependencyManagement>中鎖定了版本,所以在<dependency>下不需要再指定版本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章