从命令行 - java.lang.ClassNotFoundException: org.slf4j.LoggerFactory

From command line - java.lang.ClassNotFoundException: org.slf4j.LoggerFactory

好的。我知道还有其他类似的问题,这不是 slf4j 第一次惹我生气。但是,我在环境变量中查看了我的 PATH,下面是我的 PATH 中包含的两个 slf4j jar 文件以及我的项目依赖项。

C:\Users\pdl\.m2\repository\org\slf4j\slf4j-api.7.13\slf4j-api-1.7.13.jar
C:\Users\pdl\.m2\repository\org\slf4j\slf4j-simple.7.13\slf4j-simple-1.7.13.jar

这是我的 pom 文件中的内容:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-ext</artifactId>
        <version>1.7.13</version>
    </dependency>

我们正在 运行 的其他应用程序在 IDE 中包含 slf4j jar 依赖项,但它们未在 pom 文件中列出。我很困惑该把我看不见的东西放在哪里。

这是应用程序依赖项的样子:

我可以从 IDE (Netbeans) 运行 应用程序,但是当我尝试从命令提示符 运行 时出现以下错误。

C:\Users\pdl\Projects\WeatherTestDrive>java -cp WeatherApp.jar;WeatherOpenWeatherMap.jar;WeatherClient.jar com.a2i.weatherclient.Client
Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
        at com.a2i.weatherclient.Client.<clinit>(Client.java:22)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 1 more

在我的 VM class路径中添加 slf4j,但我仍然收到错误。

C:\Users\pdl\Projects\WeatherTestDrive>java -cp WeatherApp.jar;WeatherOpenWeatherMap.jar;WeatherClient.jar;C:\Users\pdl\.m2\repository\org\slf4j\slf4j-api.7.13\slf4j-api-1.7.13.jar;C:\Users\pdl\.m2\repository\org\slf4j\slf4j-simple.7.13\slf4j-simple-1.7.13.jar com.a2i.weatherclient.Client
Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
        at com.a2i.weatherclient.Client.<clinit>(Client.java:22)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 1 more

有人可以帮我弄清楚我做错了什么吗?

  1. 我应该将 slf4j-api 添加到我的依赖项而不是 slf4j-exe 吗?甚至其他东西?
  2. 我想无论我使用哪个,我都应该将它添加到我的 VM class路径中。
  3. 它甚至需要在我的 pom 文件中吗?

----------------------------编辑-------- ------------------------

我创建了一个简单的 HelloWorld 应用程序来记录我的名字。一旦我将 Logger 添加到我的 Hello class,它就会以红色突出显示,所以我将 slf4j-simple 添加到我的依赖项中,slf4j-api 随之而来。但是当我打开 pom 文件时,只添加了 slf4j-simple:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.13</version>
    </dependency>

当我从 IDE 运行 时,一切正常。但是当我从命令行 运行 时,我仍然得到错误:

C:\Users\pdl\Projects\HelloWorld\target>java -cp HelloWorld-1.0-SNAPSHOT.jar;C:\Users\pdl\.m2\repository\org\slf4j\slf4j-simple.7.13\slf4j-simple-1.7.13.jar com.a2i.helloworld.Hello
Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
        at com.a2i.helloworld.Hello.<clinit>(Hello.java:17)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 1 more

您的 VM 类路径中的 slf4j 在哪里?尝试 运行 如下:

java -cp WeatherApp.jar;WeatherOpenWeatherMap.jar;WeatherClient.jar;C:\Users\pdl\.m2\repository\org\slf4j\slf4j-api.7.13\slf4j-api-1.7.13.jar;C:\Users\pdl\.m2\repository\org\slf4j\slf4j-simple.7.13\slf4j-simple-1.7.13.jar com.a2i.weatherclient.Client

您的运行时缺少 slf4j。希望对您有所帮助。

Maven,因此 pom-file,旨在为您构建类路径。 所以是的,您喜欢使用的所有依赖项都应该在您的 pom 文件中。

关于slf4j: slf4j-api 是一个仅定义 api (或接口)的依赖项。要使其工作,您还必须添加一个实现。 See here 进行解释。所以你必须添加至少一个依赖项。例如:

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.1.3</version>
    </dependency>

关于 slf4j-ext,我很确定您不需要它来简单地记录。也许您有更详细的用例。

要从命令行启动您的应用程序,您必须 运行 java 使用 -cp 参数。类路径是所有使用的列表 类 或包含 类 的档案。对于具有大量依赖项的应用程序,手动构建它可能会变得非常麻烦。

使用mvn dependency:build-classpath让maven为你构建jar-paths这个大字符串

这涉及在 IntelliJ 中构建的 Java SE 项目,其中包含 slf4j - 或与此相关的任何其他库(即 slf4j-api-1.7.26.jar => API & slf4j-simple-1.7.26.jar => API 实现)...

第 1 步:

在项目根目录中创建文件夹 \libs 并将两个 JAR 文件放在那里 click to see project structure

第 2 步:

构建代码并确保 Logger 在 IDE.

中正常工作

第 3 步:

启动 cmd 并使用 cd 命令在 .\out 目录中导航,直到软件包 主要的(检查 Main.java 的第一行)。即

cd C:\Users.....\out...\testcp

第 4 步

右键单击 sjf4j-api jar 并复制路径 (path#1) &

右键单击 sjf4j-simple jar 并复制路径 (path#2) &

右键单击 Main.class 并复制路径(路径#3。SOS:排除 Main.class 部分)。

现在,运行 java 带有 -cp 标志的命令为:

java-cp 路径#1;路径#2;路径#3; org.me.Main

就是这样

注意:Eclipse 用户不会运行遇到这个问题,因为这是通过使用构建路径解决的公用事业。