使用'mvn spring-boot:run'时出错;但不能与java -jar或intelliJ一起使用

时间:2018-12-18 21:17:24

标签: java maven spring-boot

  

mvn全新安装-成功构建。

     

java -jar-应用成功运行。

     

mvn spring-boot:run-引发错误:

     

同时检测到log4j-over-slf4j.jar和绑定的slf4j-log4j12.jar   类路径,抢占StackOverflowError。也可以看看   http://www.slf4j.org/codes.html#log4jDelegationLoop了解更多详情。

[INFO] Building Application 3.1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] >>> spring-boot-maven-plugin:2.1.1.RELEASE:run (default-cli) > test-compile @ service-app >>>
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ service-app ---`enter code here`
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 5 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ service-app ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ service-app ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:\Users\name\workspace\project\service-app\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ service-app ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] <<< spring-boot-maven-plugin:2.1.1.RELEASE:run (default-cli) < test-compile @ service-app <<<
[INFO]
[INFO]
[INFO] --- spring-boot-maven-plugin:2.1.1.RELEASE:run (default-cli) @ service-app ---
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/name/.m2/repository/org/slf4j/slf4j-log4j12/1.7.25/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/name/.m2/repository/ch/qos/logback/logback-classic/1.1.11/logback-classic-1.1.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path, preempting StackOverflowError.
SLF4J: See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details.
[WARNING]
java.lang.reflect.InvocationTargetException
  

什么是mvn spring-boot:run做不同的事情?

[错误]无法在项目service-app上执行目标org.springframework.boot:spring-boot-maven-plugin:2.1.1.RELEASE:run(default-cli):运行时发生异常。 null:InvocationTargetException:ExceptionInInitializerError:在类路径上检测到log4j-over-slf4j.jar和绑定的slf4j-log4j12.jar,从而抢占了StackOverflowError。有关更多详细信息,另请参见http://www.slf4j.org/codes.html#log4jDelegationLoop。 -> [帮助1]

2 个答案:

答案 0 :(得分:1)

  

同时检测到log4j-over-slf4j.jar和绑定的slf4j-log4j12.jar   类路径,抢占StackOverflowError。也可以看看   http://www.slf4j.org/codes.html#log4jDelegationLoop了解更多详情。

之所以会这样,是因为您的类路径中有SLF4J Logger的多个实现。您将需要清理POM文件,并仅保留一个实现。

您可以尝试排除冲突的依赖项,

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

答案 1 :(得分:0)

在您的应用程序中,您有两种记录器。

1 SLF4J(仅是一个抽象,不需要进行任何实际的日志记录,因此可以切换到不同的实现)

2 Log4j1(这是一个实现,实际的日志记录由此完成)

应用程序中发生的事情

slf4j-log4j12.jar-此jar将把对slf4j记录器(org.slf4j.Logger)的所有调用都路由到log4j1中。

log4j-over-slf4j.jar-此jar将把对log4j记录器(org.apache.log4j.Logger)的任何调用都路由到slf4j。(此jar通常在您的应用程序使用log4j记录器进行编码并且您想要重定向所有这些记录时使用调用SLF4J,因此您可以将日志记录框架更改为SLF4J,而无需进行任何代码更改。

当您在类路径中同时使用两个jar时,它将在slf4j-> log4j和log4j-> slf4j之间循环记录事件,这就是为什么发生堆栈溢出异常的原因。

根据您的要求,是否要使用slf4j,log4j,log4j-over-slf4j或slf4j和log4j,您需要选择类路径中可用的正确依赖项。 对于您的问题,您需要从类路径中排除slf4j-log4j12.jarlog4j-over-slf4j.jar