SprinBootプロジェクトの起動エラースレッド 'main'java.lang.reflect.InvocationTargetExceptionの例外



Sprinboot Project Startup Error Exception Threadmainjava



エラーコード:

lottery-api-start........ SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/data/javaprogram/lottery_api/lottery_api.war!/WEB-INF/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/data/javaprogram/lottery_api/lottery_api.war!/WEB-INF/lib/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory] Exception in thread 'main' java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) at org.springframework.boot.loader.Launcher.launch(Launcher.java:50) at org.springframework.boot.loader.WarLauncher.main(WarLauncher.java:58) Caused by: java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.Log4jLoggerFactory loaded from jar:file:/data/javaprogram/lottery_api/lottery_api.war!/WEB-INF/lib/slf4j-log4j12-1.7.25.jar!/). If you are using WebLogic you will need to add 'org.slf4j' to prefer-application-packages in WEB-INF/weblogic.xml: org.slf4j.impl.Log4jLoggerFactory at org.springframework.util.Assert.instanceCheckFailed(Assert.java:637) at org.springframework.util.Assert.isInstanceOf(Assert.java:537) at org.springframework.boot.logging.logback.LogbackLoggingSystem.getLoggerContext(LogbackLoggingSystem.java:274) at org.springframework.boot.logging.logback.LogbackLoggingSystem.beforeInitialize(LogbackLoggingSystem.java:99) at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationStartingEvent(LoggingApplicationListener.java:191) at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:170) at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127) at org.springframework.boot.context.event.EventPublishingRunListener.starting(EventPublishingRunListener.java:68) at org.springframework.boot.SpringApplicationRunListeners.starting(SpringApplicationRunListeners.java:48) at org.springframework.boot.SpringApplication.run(SpringApplication.java:313) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1255) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1243) at com.zhibo.api.App.main(App.java:10) ... 8 more

理由



大まかに見ると、1つか2つ推測できます。クラスパスで、SLF4Jログインターフェイスの2倍のバインディングを作成します。
公式ログファイルを確認してください。

SLF4J API is designed to bind with one and only one underlying logging framework at a time. If more than one binding is present on the class path, SLF4J will emit a warning, listing the location of those bindings. When multiple bindings are available on the class path, select one and only one binding you wish to use, and remove the other bindings. For example, if you have both slf4j-simple-1.8.0-beta4.jar and slf4j-nop-1.8.0-beta4.jar on the class path and you wish to use the nop (no-operation) binding, then remove slf4j-simple-1.8.0-beta4.jar from the class path. The list of locations that SLF4J provides in this warning usually provides sufficient information to identify the dependency transitively pulling in an unwanted SLF4J binding into your project. In your project's pom.xml file, exclude this SLF4J binding when declaring the unscrupulous dependency. For example, cassandra-all version 0.8.1 declares both log4j and slf4j-log4j12 as compile-time dependencies. Thus, when you include cassandra-all as a dependency in your project, the cassandra-all declaration will cause both slf4j-log4j12.jar and log4j.jar to be pulled in as dependencies. In case you do not wish to use log4j as the the SLF4J backend, you can instruct Maven to exclude these two artifacts as shown next: org.apache.cassandra cassandra-all 0.8.1 org.slf4j slf4j-log4j12 log4j log4j NOTE The warning emitted by SLF4J is just that, a warning. Even when multiple bindings are present, SLF4J will pick one logging framework/implementation and bind with it. The way SLF4J picks a binding is determined by the JVM and for all practical purposes should be considered random. As of version 1.6.6, SLF4J will name the framework/implementation class it is actually bound to. Embedded components such as libraries or frameworks should not declare a dependency on any SLF4J binding but only depend on slf4j-api. When a library declares a compile-time dependency on a SLF4J binding, it imposes that binding on the end-user, thus negating SLF4J's purpose. When you come across an embedded component declaring a compile-time dependency on any SLF4J binding, please take the time to contact the authors of said component/library and kindly ask them to mend their ways.

参照の依存関係が与えられましたが、外部jarとspringboot自体への参照slf4jが競合しているため、この依存関係は私の問題を解決しません。



したがって、最後にjarまたはspringboot自体のslf4jを削除すると、解決できます。

jarは再コンパイルしてパッケージ化する必要があり、sb自体のslf4jを削除するのは面倒です。
私自身の解決策:

プロジェクトにパブリックアプリケーションJARパッケージがあるため、org.slf4jがJARで参照されているため、SpringBoot自体が持つ「org.slf4j」を除外する必要があります。



org.springframework.boot spring-boot-starter-web org.slf4j slf4j-log4j12

オンラインで見つかったソリューション:

解決策1:

スターター-slf4jの頂点に立つWebスタートアップの依存関係

org.springframework.boot spring-boot-starter-web ch.qos.logback logback-classic

解決策2:

org.springframework.boot spring-boot-configuration-processor true

起動は、jarのデフォルトのログレベルで開始されます。

その後、正常に開始しました!

SLF4Jドキュメント: http://www.slf4j.org/codes.html#multiple_bindings

springbootログのログバックログを削除し、外部jarと同期したログログに変更することをお勧めします。

解決策3:

org.springframework.boot spring-boot-starter-log4j 1.3.8.RELEASE org.slf4j slf4j-log4j12

解決策4:

org.apache.logging.log4j log4j-slf4j-impl

著者:おばさんのトマトソース
出典:CSDN
元の: https://blog.csdn.net/weixin_38361347/article/details/88351246
著作権表示:この記事はブロガーのオリジナル記事です。ブログ投稿リンクを添付してください。