使用“mvn spring引导:运行”时出错;但不适用于java-jar或intelliJ

使用“mvn spring引导:运行”时出错;但不适用于java-jar或intelliJ,java,maven,spring-boot,Java,Maven,Spring Boot,mvn清理安装-成功构建 java-jar-app成功运行 mvn spring启动:运行-引发错误: 在服务器上检测到log4j-over-slf4j.jar和绑定的slf4j-log4j12.jar 类路径,抢占堆栈溢出错误。另见 更多细节 什么是mvn spring boot:以不同的方式运行 [错误]无法执行目标org.springframework.boot:spring boot maven plugin:2.1.1。发布:在project service app上运行默认cli:运

mvn清理安装-成功构建

java-jar-app成功运行

mvn spring启动:运行-引发错误:

在服务器上检测到log4j-over-slf4j.jar和绑定的slf4j-log4j12.jar 类路径,抢占堆栈溢出错误。另见 更多细节

什么是mvn spring boot:以不同的方式运行

[错误]无法执行目标org.springframework.boot:spring boot maven plugin:2.1.1。发布:在project service app上运行默认cli:运行时发生异常。null:InvocationTargetException:ExceptionInInitializeError:在类路径上检测到log4j-over-slf4j.jar和绑定的slf4j-log4j12.jar,抢占StackOverflowerError。有关更多详细信息,请参见[帮助1]

在服务器上检测到log4j-over-slf4j.jar和绑定的slf4j-log4j12.jar 类路径,抢占堆栈溢出错误。另见 更多细节

您之所以看到这一点,是因为在类路径中有多个SLF4J记录器的实现。您必须清理POM文件并只保留一个实现

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

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

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

1 SLF4J只是一个抽象,没有实际的日志记录,因此您可以切换到不同的实现

2 Log4j1这是一个实现,实际的日志记录是由这个

应用程序中发生的事情是

slf4j-log4j12.jar-此jar将任何对slf4j记录器org.slf4j.Logger的调用路由到log4j1

log4j-over-slf4j.jar-此jar将任何对log4j loggers org.apache.log4j.Logger的调用路由到slf4j。当您的应用程序使用log4j loggers编码,并且您希望将所有日志调用重定向到slf4j时,此jar通常使用,因此您可以在不更改任何代码的情况下将日志框架更改为slf4j

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

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

我如何知道应该为哪些依赖项插入“排除项”的可能重复?@xpagesbeast好问题,要确定这些依赖项的用途,您需要知道spark依赖项加载的是一个集合,而spring加载的是另一个集合。
<exclusions>
  <exclusion> 
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
  </exclusion>
  <exclusion> 
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
  </exclusion>
</exclusions>