当前位置: 首页 > 知识库问答 >
问题:

在类路径上找到多个绑定

孙星鹏
2023-03-14

我正在使用 Gradle 作为构建工具,在部署过程中,我遇到了一些我在下面提到的问题。

Gradle构建任务没有问题,但当我在tomcat8上部署它时,它显示如下错误。

build.gradle依赖文件如下:

dependencies {

    testCompile group: 'junit', name: 'junit', version: '4.12'

    compile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
    compile group: 'org.json', name: 'json', version: '20090211'

    // Apache Kafka Dependencies
    compile group: 'org.apache.kafka', name: 'kafka-clients', version: '2.0.0'
    compile group: 'org.apache.kafka', name: 'connect-json', version: '2.0.0'

    // Office365 authentication Dependencies
    compile group: 'com.microsoft.azure', name: 'adal4j', version: '1.6.0'
    runtime group: 'com.nimbusds', name: 'oauth2-oidc-sdk', version: '5.24.1'

    // Apache Hadoop HDFS Dependencies
    compile group: 'org.apache.hadoop', name: 'hadoop-hdfs', version: '2.9.1'
    compile group: 'org.apache.hadoop', name: 'hadoop-hdfs-client', version: '2.9.1'
    compile group: 'org.apache.hadoop', name: 'hadoop-common', version: '2.9.1'
    compile group: 'org.apache.hive', name: 'hive-jdbc', version: '2.3.3'

    // Spring Dependencies
    compile group: 'opensymphony', name: 'sitemesh', version: '2.4.2'
    compile group: 'org.springframework', name: 'spring-webmvc', version: '4.3.14.RELEASE'
    compile group: 'org.springframework', name: 'spring-tx', version: '4.3.14.RELEASE'

    // Mysql Connector Dependency
    compile group: 'mysql', name: 'mysql-connector-java', version: '6.0.6'

    // Apache Spark Dependencies
    compile group: 'com.databricks', name: 'spark-csv_2.11', version: '1.5.0'
    compile group: 'org.apache.spark', name: 'spark-sql_2.11', version: '2.3.0'
    compile group: 'org.apache.spark', name: 'spark-core_2.11', version: '2.3.0'
    compile group: 'com.fasterxml.jackson.module', name: 'jackson-module-scala_2.11', version: '2.8.8'

    // Apache Storm & Apache Kafka Consumer Dependencies
    compile group: 'org.apache.storm', name: 'storm-core', version: '1.2.0'
    compile group: 'org.apache.storm', name: 'storm-kafka', version: '1.2.0'
    compile group: 'org.apache.kafka', name: 'kafka_2.10', version: '0.9.0.1'

    // Elasticsearch Dependencies
    compile group: 'org.elasticsearch.client', name: 'elasticsearch-rest-high-level-client', version: '6.5.2'
    compile group: 'org.elasticsearch', name: 'elasticsearch', version: '6.5.2'
    //compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.1'
    //compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.1'
    //compile group: 'org.slf4j', name: 'slf4j-log4j12'
}   

错误消息:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/sagarjoshi/opt/tomcat-analytics/apache-tomcat-8.0.53/webapps/analytics/WEB-INF/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/sagarjoshi/opt/tomcat-analytics/apache-tomcat-8.0.53/webapps/analytics/WEB-INF/lib/log4j-slf4j-impl-2.8.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/sagarjoshi/opt/tomcat-analytics/apache-tomcat-8.0.53/webapps/analytics/WEB-INF/lib/logback-classic-1.0.9.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 slf4j-log4j12.jar on the class path, preempting StackOverflowError. 
SLF4J: See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details.
17-Dec-2018 11:32:29.244 SEVERE [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal Error during ServletContainerInitializer processing
 javax.servlet.ServletException: Failed to instantiate WebApplicationInitializer class
    at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:155)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5352)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:755)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:731)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
    at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1730)
    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.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:485)
    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:434)
    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.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
    at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)
    at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
    at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)
    at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401)
    at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)
    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 sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)
    at sun.rmi.transport.Transport$1.run(Transport.java:200)
    at sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

共有2个答案

颜森
2023-03-14

检查您的项目依赖关系。真的需要这么多编译依赖吗?检查所有API并使用匹配的范围。大概< code>runtime经常就够了。

您的项目具有多个用于日志记录 API 和桥接的定义(log4 和使用 slf4j 进行回溯)。确定要使用的依赖项并相应地声明依赖项。提供已使用日志记录 API 的配置。

请参阅slf4j-bridges和桥接工作原理。

如果您想识别具有违规瞬态依赖关系的项目,请使用gradle依赖关系树(请参阅gradle-检查依赖关系)

gradlew dependencies

可能在分析完依赖项之后,您可能需要根据您的运行时环境排除一些依赖项。如何做到这一点,请参见gradle -管理暂时依赖关系。

连德义
2023-03-14

SLF4J API被设计成一次只能绑定一个底层日志框架。如果类路径中存在多个绑定,SLF4J将发出警告,列出这些绑定的位置。

当类路径上有多个绑定可用时,请选择一个且仅一个您希望使用的绑定,并删除其他绑定。例如,如果类路径上有slf4j-simple-2.0.0-alpha2.jar和slf4j-nop-2.0.0-alpha2.jar,并且您希望使用nop(无操作)绑定,则从类路径中删除slf4j-simple-2.0.0-alpha2.jar。

SLF4J在此警告中提供的位置列表通常提供了足够的信息,以识别将不需要的SLF4J绑定传递到项目中的依赖关系。在项目的pom中。xml文件,在声明不道德的依赖项时排除此SLF4J绑定。例如,cassandra all版本0.8.1将log4j和slf4j-log4j12声明为编译时依赖项。因此,当您将cassandra all作为依赖项包含在项目中时,Cassandraall声明将导致slf4j-log4j12.jar和log4j。jar作为依赖项被拉入。如果您不希望使用log4j作为SLF4J后端,您可以指示Maven排除这两个工件,如下所示:

xml prettyprint-override"><dependencies>
  <dependency>
    <groupId> org.apache.cassandra</groupId>
    <artifactId>cassandra-all</artifactId>
    <version>0.8.1</version>

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

  </dependency>
</dependencies>
 类似资料:
  • 我的应用程序服务器ibm WebSphere。我在应用程序服务器日志中得到以下错误。哪里可以设置websphere? [19.09.2012 14:56:54:940 EEST]0000000a SystemErr R SLF4J:类路径包含多个SLF4J绑定。 [19.09.2012 14:56:54:940 EEST]0000000a SystemErr R SLF4J:在[wsjar:fil

  • 问题内容: 我不太确定是什么原因导致的,因为清单中正确列出了它: 我还添加了来构建路径,并将其移至的顶部,但是它仍然给我同样的错误。 编辑:我完全重建了该项目,并且无法重现该错误。不知道是什么原因造成的。 问题答案: 我的项目有同样的问题。这是由于我的项目与我在项目中添加的库项目之间的android支持库版本冲突而发生的。将相同版本的android支持库放入您的项目和包含的库项目中,并清理构建 …

  • 问题内容: 我目前正在一个项目中,我必须使用纯本地ndk。当我尝试从Irrlicht引擎源运行helloworld示例时,它起作用了。然后,按照该示例的相同格式尝试在我的项目中使用它。但是我得到了: 在运行我的项目时。 这是我的main.cpp文件: n Android.mk: 我在AndroidManifest.xml中给了Activity名称: 我在这里做什么错?如有必要,我将发布完整代码。

  • 我目前正在做一个项目,在这个项目中我必须使用纯原生的NDK。当我尝试从Irrlicht引擎源代码运行helloworld示例时,它起到了作用。然后我尝试在我的项目中使用它,遵循该示例的相同格式。但我得到: 在运行我的项目时。 并且我在AndroidManifest.xml中给出了活动名称: 我在这里犯了什么错误?如果需要,我会发布完整的代码。

  • 我收到编译错误。我不确定是哪个依赖项提供了这个错误。我正在使用@slf4j lombok注释在我的类中实现日志记录。 SLF4J:类路径包含多个SLF4J绑定。slf4j:在[jar:file:/home/andrius/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-log4j12/1.7.25/110cefe2df103412849d72e