2017-04-15 35 views
1

我寫了這個pom.xml基於春季啓動樣本。如何解決各種log4j軟件包衝突?

當我開始我的應用程序,我得到這個錯誤:

SLF4J: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path, preempting StackOverflowError.

我完全新的Java和Maven的,並堅持在這裏相當長一段時間。

我試圖在dependency中寫一些exclusions。但它沒有解決。我不知道應該從哪個包中排除哪個包。如果是這樣,依賴的包裹怎麼能正常工作?

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
     <!-- Your own application should inherit from spring-boot-starter-parent --> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-samples</artifactId> 
     <version>2.0.0.BUILD-SNAPSHOT</version> 
    </parent> 
    <artifactId>spring-boot-sample-web-secure-jdbc</artifactId> 
    <name>Spring Boot Web Secure JDBC Sample</name> 
    <description>Spring Boot Web Secure JDBC Sample</description> 
    <url>http://projects.spring.io/spring-boot/</url> 
    <organization> 
     <name>Pivotal Software, Inc.</name> 
     <url>http://www.spring.io</url> 
    </organization> 
    <properties> 
     <main.basedir>${basedir}/../..</main.basedir> 
    </properties> 
    <dependencies> 
     <!-- Compile --> 
     <dependency> 
      <groupId>org.apache.hadoop</groupId> 
      <artifactId>hadoop-common</artifactId> 
      <version>3.0.0-alpha2</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-security</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-thymeleaf</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-jdbc</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>com.h2database</groupId> 
      <artifactId>h2</artifactId> 
     </dependency> 
     <!-- Test --> 
     <dependency> 
      <groupId>org.apache.httpcomponents</groupId> 
      <artifactId>httpclient</artifactId> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 

    </dependencies> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 
</project> 
+0

什麼是你用來運行你的應用程序的容器(服務器)? –

+0

考慮關於spring引導日誌的[post](https://docs.spring.io/spring-boot/docs/current/reference/html/howto-logging.html)。這也是一個很好的[示例](https://www.mkyong.com/spring-boot/spring-boot-slf4j-logging-example/)。 –

回答

2

這是因爲spring-boot-starterlog4j-over-slf4j拉動的依賴,和你的其他的一個依賴於log4j的拉動。

運行mvn dependency:tree,你應該能夠找到它關係在不需要的log4j的拉動和與

<exclusions> 
    <exclusion> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-log4j12</artifactId> 
    </exclusion> 
    <exclusion> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    </exclusion> 
</exclusions> 

排除它可能只是取決於你看到你mvn dependency:tree

什麼那些之一

如果您寧願使用log4j,那麼顯然只需從spring-boot-starter中排除log4j-over-slf4j

-1

我在你的pom.xml中看到log4j沒有依賴關係。你應該把這個給你的pom.xml:

<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.17</version> 
</dependency> 
+0

假設這是答案錯誤。 'spring-boot-starter-logging'是你所需要的。 –

0

這個問題是由於日誌外觀日誌框架之間的無限循環調用造成的。

https://www.slf4j.org/codes.html#log4jDelegationLoop

我的情況稍微複雜。除了這個循環問題。我有兩個日誌框架

我最終排除log4j的環比SLF4J的logback經典