【问题标题】:LinkageError - loader constraint violation - when resolving method "org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()"LinkageError - 加载程序约束冲突 - 解析方法“org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()”时
【发布时间】:2017-07-05 14:41:44
【问题描述】:

我收到以下错误:

ContextListenerjava.lang.LinkageError: loader constraint violation: when resolving method "org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILoggerFactory;" the class loader 'org.apache.catalina.loader.WebappClassLoader@4d1cc3c3 (urls: ['], parents: [)'java.net.URLClassLoader@4fccd51b']) of the current class, org/slf4j/LoggerFactory, and the class loader 'System (urls: [''file:/usr/lib/jvm/jvm_8/jvm_8/lib/jvmx.jar', 'file:/usr/lib/jvm/jvm_8/jvm_8/lib/tools.jar', 'file:/ ....

似乎我的云平台默认包slf4j,我收到此错误是因为我还将slf4j作为依赖项放在我的pom文件中,并且两个不同的类加载器正在加载slf4j

我解决问题的方法是将pom中的依赖范围更改为provided。

但副作用是我无法在本地 tomcat 上运行它,因为它找不到 slf4j 库。

在这种情况下可以做些什么来让我的战争在我的云平台和我的本地 tomcat 上都能正常运行?

【问题讨论】:

    标签: java tomcat maven-2 classloader slf4j


    【解决方案1】:

    您可以在 pom.xml 中使用不同的配置文件。

    SAP 云平台示例:

    <profiles>
            <profile>
                <id>local</id>
                <properties>
                    <packaging.type>jar</packaging.type>
                </properties>
                <activation>
                    <activeByDefault>true</activeByDefault>
                </activation>
                <dependencies>
                    <dependency>
                        <groupId>com.h2database</groupId>
                        <artifactId>h2</artifactId>
                    </dependency>
                </dependencies>
            </profile>
        <profile>
            <id>scp</id>
            <properties>
                <packaging.type>war</packaging.type>
            </properties>
            <build>
                <finalName>LoraConnector</finalName>
            </build>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                    <scope>provided</scope>
                </dependency>
                <dependency>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                    <scope>provided</scope>
                </dependency>
                <dependency>
                    <groupId>org.slf4j</groupId>
                    <artifactId>jul-to-slf4j</artifactId>
                    <scope>provided</scope>
                </dependency>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                    <scope>provided</scope>
                </dependency>
                <dependency>
                    <groupId>com.h2database</groupId>
                    <artifactId>h2</artifactId>
                    <scope>test</scope>
                </dependency>
            </dependencies>
        </profile>
    </profiles>
    

    您可以使用 Eclipse(或其他工具)中的“运行配置”或在构建 war 文件时使用配置文件:

    mvn -P scp clean package
    

    【讨论】:

      【解决方案2】:

      如果您使用的是 spring-boot-starter-web-1.5.1.RELEASE.jar,则需要排除 jul-to-slf4j-1.7.22.jar、jcl-over-slf4j-1.7.22。 jar.这两个jar有冲突slf4j-api。 <plugin> <artifactId>maven-war-plugin</artifactId> <version>2.6</version> <configuration> <packagingExcludes> WEB-INF/lib/jcl-over-slf4j-1.7.22.jar,WEB-INF/lib/jul-to-slf4j-1.7.22.jar </packagingExcludes> </configuration> </plugin>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-30
        • 2011-12-23
        相关资源
        最近更新 更多