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

时间:2016-01-21 00:07:07

标签: java maven slf4j

行。我知道还有其他问题,比如这个,这不是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文件中列出。我很困惑在哪里放置我能看到的东西。

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

Dependencies Screen Capture

我可以从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

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

  1. 我应该将slf4j-api添加到我的依赖项而不是slf4j-exe吗?或者甚至别的什么?
  2. 我想无论我使用哪一个,我都应该将它添加到我的VM类路径中。
  3. 它甚至需要在我的pom文件中吗?
  4. ------------------------------编辑------------- ---------------------

    我创建了一个简单的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
    

3 个答案:

答案 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实现)...

步骤1:

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

步骤2:

构建代码,并确保Logger在IDE中正常运行。

步骤3:

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

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

步骤#4

右键单击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 实用程序来解决此问题。