java Spring Maven 项目 commons-logging LogFactory NoClassDefFoundError

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/27926637/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 12:38:09  来源:igfitidea点击:

Spring Maven project commons-logging LogFactory NoClassDefFoundError

javaspringmavenapache-commons-logging

提问by Mark Nugent

I have a Maven project that uses Spring to run a json web service. The project runs fine in NetBeans. It gets compiled into a jar file, and the jar file runs fine in an Ubuntu VM. However, when I try to run the jar file in Windows, I get the following error.

我有一个使用 Spring 运行 json Web 服务的 Maven 项目。该项目在 NetBeans 中运行良好。它被编译成一个 jar 文件,该 jar 文件在 Ubuntu VM 中运行良好。但是,当我尝试在 Windows 中运行 jar 文件时,出现以下错误。

java -jar myjar.jar --server.port=8000

java -jar myjar.jar --server.port=8000

java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:53)
        at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
        at org.springframework.core.io.support.SpringFactoriesLoader.<clinit>(SpringFactoriesLoader.java:58)
        at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:368)
        at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:359)
        at org.springframework.boot.SpringApplication.initialize(SpringApplication.java:230)
        at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:206)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:961)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:950)
        at com.baselayer.dal.core.Application.main(Application.java:20)
        ... 6 more
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
        at java.net.URLClassLoader.run(Unknown Source)
        at java.net.URLClassLoader.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 14 more

I have spend an entire day trying to figure this out, to no avail.

我花了一整天的时间试图弄清楚这一点,但无济于事。

Can anyone shed any light?

任何人都可以发光吗?

This is my pom.xml below.

这是我下面的 pom.xml。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.baselayer</groupId>
    <artifactId>dal</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>Baselayer Core DAL</name>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.0.RELEASE</version>
    </parent>


    <properties>
        <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <compilerArguments>
                        <endorseddirs>${endorsed.dir}</endorseddirs>
                    </compilerArguments>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>     
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.6</version>
                <executions>
                    <execution>
                        <phase>validate</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${endorsed.dir}</outputDirectory>
                            <silent>true</silent>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>javax</groupId>
                                    <artifactId>javaee-endorsed-api</artifactId>
                                    <version>7.0</version>
                                    <type>jar</type>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <dependencies>        
        <dependency>
          <groupId>commons-logging</groupId>
          <artifactId>commons-logging</artifactId>
          <version>1.1.1</version>
          <scope>provided</scope>
        </dependency>      
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-cassandra</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>antlr</artifactId>
                    <groupId>org.antlr</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>metrics-core</artifactId>
                    <groupId>com.yammer.metrics</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>liquibase-core</artifactId>
                    <groupId>org.liquibase</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.datastax.cassandra</groupId>
            <artifactId>cassandra-driver-mapping</artifactId>
            <version>2.1.2</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>
        <dependency>
                <groupId>org.codehaus.Hymanson</groupId>
                <artifactId>Hymanson-core-asl</artifactId>
                <version>1.9.2</version>
                <type>jar</type>
        </dependency>        
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
    </dependencies>    
</project>

回答by Lorenzo Conserva

Spring Framework uses Apache Commons Logging API for logging. In Spring Boot parent POM there is an explicit exclusion of the Commons Logging library.

Spring Framework 使用 Apache Commons Logging API 进行日志记录。在 Spring Boot 父 POM 中,明确排除了 Commons Logging 库。

<exclusion>
    <artifactId>commons-logging</artifactId>
    <groupId>commons-logging</groupId>
</exclusion>

This means that it's left to you to provide a chosen Commons Logging Implementation to Spring classes at runtime.

这意味着您需要在运行时为 Spring 类提供一个选定的 Commons Logging 实现。

You can add commons-logging to your POM, latest version is 1.2, released in July 2014.

您可以将 commons-logging 添加到您的 POM,最新版本是 1.2,于 2014 年 7 月发布。

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>

Or you can bridge Apache Commons Logging API to SLF4J Api (see http://www.slf4j.org/legacy.html) with the jcl-over-slf4j.jar and then add an SLF4L implementation of your choice. For example:

或者,您可以使用 jcl-over-slf4j.jar 将Apache Commons Logging API 桥接到 SLF4J Api(参见http://www.slf4j.org/legacy.html),然后添加您选择的 SLF4L 实现。例如:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
</dependency>

回答by Steve

You included the following on your commons-loggingdependency:

您在commons-logging依赖项中包含以下内容:

<scope>provided</scope>

This is an instruction to prevent commons-loggingfrom being included in your jar. Hence it not being on the classpath.

这是防止commons-logging包含在您的 jar 中的说明。因此它不在类路径上。