线程“main”中出现异常 java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory 使用 logback-classic

问题描述 投票:0回答:1

像这样构建程序后运行我的程序时

mvn clean install
然后使用
java -jar target/Sorting-1.0-SNAPSHOT.jar
运行它。我收到此错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
    at xyz.skwar.sorting.Main.<clinit>(Main.java:7)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
    ... 1 more

我通过阅读这篇articel自己研究了它,它不相关,因为它与依赖性有关。我阅读了以下堆栈溢出帖子:

这些都没有解决问题,因为我不仅包括 API,还包括日志记录库,我尝试了第四个解决方案,但也不起作用。第 5 个也不相关,因为我没有设定范围。 当我删除

slf4j-api
时,它会失败,即使根据 slf4j docs logback-classic 提供了 slf4j-api:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

我还制作了最小的代码示例,但仍然存在问题:

package xyz.skwar.sorting;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
  private static final Logger logger = LoggerFactory.getLogger(Main.class);

  public static void main(String[] args) {
    logger.info("test");
  }
}

这也是整个 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>xyz.skwar.sorting</groupId>
  <artifactId>Sorting</artifactId>
  <version>1.0-SNAPSHOT</version>

  <properties>
    <maven.compiler.source>20</maven.compiler.source>
    <maven.compiler.target>20</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <org.slf4j.version>2.0.9</org.slf4j.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.30</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.testng</groupId>
      <artifactId>testng</artifactId>
      <version>7.8.0</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.4.11</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>${org.slf4j.version}</version>
    </dependency>
  </dependencies>
  <pluginRepositories>
    <pluginRepository>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
    </pluginRepository>
  </pluginRepositories>
  <build>
    <plugins>
      <plugin>
        <!-- Build an executable JAR -->
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.1.0</version>
        <configuration>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
              <classpathPrefix>lib/</classpathPrefix>
              <mainClass>xyz.skwar.sorting.Main</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
java logback slf4j
1个回答
0
投票

使用手动 Maven 配置创建 Fat jar 有两个步骤。

  1. 复制
    libs
    目录下的依赖项(您的pom中缺少
  2. 创建可执行 jar 并将类路径指定为
    libs
    目录。 (你已经在这样做了。

因此使用

maven-dependency-plugin
将依赖项复制到
libs
目录下,然后就可以正常工作了。

© www.soinside.com 2019 - 2024. All rights reserved.