使用 'mvn spring-boot:run' 时出错;但不适用于 java -jar 或 intelliJ
Posted
技术标签:
【中文标题】使用 \'mvn spring-boot:run\' 时出错;但不适用于 java -jar 或 intelliJ【英文标题】:Error using 'mvn spring-boot:run'; but not with java -jar or intelliJ使用 'mvn spring-boot:run' 时出错;但不适用于 java -jar 或 intelliJ 【发布时间】:2019-05-19 08:28:48 【问题描述】:mvn clean install - 构建成功。
java -jar - 应用程序运行成功。
mvn spring-boot:run - 抛出错误:
同时检测到 log4j-over-slf4j.jar 和绑定 slf4j-log4j12.jar 类路径,抢占 ***Error。也可以看看 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 ***Error.
SLF4J: See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details.
[WARNING]
java.lang.reflect.InvocationTargetException
mvn spring-boot:run 有何不同?
[错误] 无法在项目服务应用程序上执行目标 org.springframework.boot:spring-boot-maven-plugin:2.1.1.RELEASE:run (default-cli):运行时发生异常。 null:InvocationTargetException:ExceptionInInitializerError:在类路径上检测到 log4j-over-slf4j.jar 和绑定 slf4j-log4j12.jar,抢占 ***Error。另请参阅http://www.slf4j.org/codes.html#log4jDelegationLoop 了解更多详情。 -> [帮助 1]
【问题讨论】:
***.com/questions/20117720/…的可能重复 【参考方案1】:同时检测到 log4j-over-slf4j.jar 和绑定 slf4j-log4j12.jar 类路径,抢占 ***Error。也可以看看 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>
【讨论】:
我如何知道应该为哪些依赖项插入“排除项”? @xpagesbeast 好问题,决定您需要了解这些依赖项的目的。 似乎 spark 依赖项正在加载一组,而 spring 正在加载另一组。【参考方案2】:在您的应用程序中,您有 2 种类型的记录器。
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.jar
或 log4j-over-slf4j.jar
。
【讨论】:
以上是关于使用 'mvn spring-boot:run' 时出错;但不适用于 java -jar 或 intelliJ的主要内容,如果未能解决你的问题,请参考以下文章
mvn spring-boot:run 导致用户'root'@'localhost'的访问被拒绝(使用密码:YES)
mvn spring-boot:run 不会在资源中执行 schema.sql
spring boot 实战 / mvn spring-boot:run 参数详解
Spring Boot 应用程序 - 启动时间与“mvn spring-boot:run”和“java -jar”的差异