将具有Log4j2的项目导出到JAR时出错

时间:2014-06-24 16:14:13

标签: java eclipse jar log4j2

我为使用Log4j2的项目创建了一个JAR文件。我已经在' lib'中保存了Log4j2 jar(用于CORE和API)。 ' src'下的文件夹夹。在Eclipse中,我导出了我的项目来创建JAR文件,我已经检查了' lib'文件夹包含在/存在于JAR文件中。

当我从eclipse中运行项目时,它运行得非常好但是当我尝试通过cmd提示符执行jar时,我收到以下错误:

C:\Users\workspace>java -jar ConnectorClient.jar
    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/logging/log4j/LogManager
            at com.client.ConnectionClient.<clinit>(ConnectionClient.java:20)
    Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.LogManager
            at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
            at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
            at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
            ... 1 more

导致错误的代码(第20行)中的行是:

private static Logger logger = LogManager.getLogger(ConnectionClient.class);

好像没有读取Log4j2罐子。请有人能帮助我。我已经在项目的Java Build Path中添加了2个jar,如图所示..

Jars added to Java Build Path

我的类路径文件(存在于项目文件夹中)包括问题中的2个罐子,如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.8.0_05"/>
    <classpathentry kind="lib" path="lib/log4j-api-2.0-rc1.jar"/>
    <classpathentry kind="lib" path="lib/log4j-core-2.0-rc1.jar"/>
    <classpathentry kind="output" path="bin"/>
</classpath>

请帮忙吗?

谢谢

2 个答案:

答案 0 :(得分:2)

也许您想要导出 Runnable Jar文件

Runnable Jar

并包含所需的库:

enter image description here

答案 1 :(得分:1)

有一种常见的误解,认为罐子可以装入另一个罐子里。它只是不可用于类加载器,因此最终会出现类加载异常。

所以你要么将依赖jar提取到你自己的jar中,正如@PaulVargas使用eclipse所描述的那样,或者你做了90%的人做的事情并将你的依赖项添加到jar执行的类路径中:

java -classpath libs/*.jar -jar MyJar.jar

这意味着将所有依赖项放在一个单独的文件夹(此处为libs)中,而不是打包在jar中。