我为使用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,如图所示..
我的类路径文件(存在于项目文件夹中)包括问题中的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>
请帮忙吗?
谢谢
答案 0 :(得分:2)
也许您想要导出 Runnable Jar文件:
并包含所需的库:
答案 1 :(得分:1)
有一种常见的误解,认为罐子可以装入另一个罐子里。它只是不可用于类加载器,因此最终会出现类加载异常。
所以你要么将依赖jar提取到你自己的jar中,正如@PaulVargas使用eclipse所描述的那样,或者你做了90%的人做的事情并将你的依赖项添加到jar执行的类路径中:
java -classpath libs/*.jar -jar MyJar.jar
这意味着将所有依赖项放在一个单独的文件夹(此处为libs)中,而不是打包在jar中。