2017-04-15 36 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经典