从命令行 - 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
有人可以帮我弄清楚我做错了什么吗?
- 我应该将 slf4j-api 添加到我的依赖项而不是 slf4j-exe 吗?甚至其他东西?
- 我想无论我使用哪个,我都应该将它添加到我的 VM class路径中。
- 它甚至需要在我的 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 用户不会运行遇到这个问题,因为这是通过使用构建路径解决的公用事业。
好的。我知道还有其他类似的问题,这不是 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
有人可以帮我弄清楚我做错了什么吗?
- 我应该将 slf4j-api 添加到我的依赖项而不是 slf4j-exe 吗?甚至其他东西?
- 我想无论我使用哪个,我都应该将它添加到我的 VM class路径中。
- 它甚至需要在我的 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 用户不会运行遇到这个问题,因为这是通过使用构建路径解决的公用事业。