行。我知道还有其他问题,比如这个,这不是slf4j第一次踢我的屁股。但是,我在环境变量中查看了我的PATH,下面是我的PATH中包含的两个slf4j jar文件以及我的项目依赖项。
C:\Users\pdl\.m2\repository\org\slf4j\slf4j-api\1.7.13\slf4j-api-1.7.13.jar
C:\Users\pdl\.m2\repository\org\slf4j\slf4j-simple\1.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类路径中添加slf4j,我仍然收到错误。
C:\Users\pdl\Projects\WeatherTestDrive>java -cp WeatherApp.jar;WeatherOpenWeatherMap.jar;WeatherClient.jar;C:\Users\pdl\.m2\repository\org\slf4j\slf4j-api\1.7.13\slf4j-api-1.7.13.jar;C:\Users\pdl\.m2\repository\org\slf4j\slf4j-simple\1.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
有人可以帮我弄清楚我做错了吗?
------------------------------编辑------------- ---------------------
我创建了一个简单的HelloWorld应用来记录我的名字。一旦我将Logger添加到我的Hello类中,它就会以红色突出显示,所以我将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\1.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
答案 0 :(得分:2)
VM类路径中的slf4j在哪里?尝试运行如下:
java -cp WeatherApp.jar;WeatherOpenWeatherMap.jar;WeatherClient.jar;C:\Users\pdl\.m2\repository\org\slf4j\slf4j-api\1.7.13\slf4j-api-1.7.13.jar;C:\Users\pdl\.m2\repository\org\slf4j\slf4j-simple\1.7.13\slf4j-simple-1.7.13.jar com.a2i.weatherclient.Client
您从运行时缺少slf4j。希望有所帮助。
答案 1 :(得分:2)
Maven,以及pom文件,旨在为您构建类路径。 所以,是的,你喜欢使用的所有依赖都应该在你的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,我很确定你不需要它来简单记录。也许你有更复杂的用例。
要从命令行启动应用程序,必须使用-cp
参数运行java。类路径是列出所有使用的类或包含类的存档。对于具有大量依赖性的应用程序,手动构建它会变得非常麻烦。
使用mvn dependency:build-classpath
让maven为你构建这一大串jar路径。
答案 2 :(得分:1)
这涉及在IntelliJ中构建的Java SE项目,其中包含slf4j(或与此相关的任何其他库)(即slf4j-api-1.7.26.jar => API和slf4j-simple-1.7.26.jar = > API实现)...
在项目根目录中创建\ libs文件夹,并将两个JAR放在其中click to see project structure
构建代码,并确保Logger在IDE中正常运行。
启动cmd并使用。\ out目录中的cd命令进行导航,直到软件包 主目录(检查Main.java的第一行)。即
cd C:\ Users ..... \ out ... \ testcp
右键单击sjf4j-api jar并复制路径(路径#1)&
右键单击sjf4j-simple jar并复制路径(路径#2)&
右键单击Main.class并复制路径(路径#3。SOS:排除Main.class部分)。
现在,运行带有-cp标志的Java命令为
java -cp path#1; path#2; path#3; org.me.Main
就这样
注意:Eclipse用户不会遇到此问题,因为可以通过使用 build path 实用程序来解决此问题。