繁体   English   中英

带有log4j的java.lang.ClassNotFoundException

[英]java.lang.ClassNotFoundException with log4j

我正在用gradle尝试我的第一个项目。 我的项目具有log4j-1.2.17.jar的依赖项。构建我的项目后,将生成一个jar文件。 我尝试使用以下命令运行它:

java -classpath ".:/home/ec2-user/dlsvr/lib/log4j-1.2.17.jar" -jar dlsvr.jar

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Logger
        at com.secutrans.dlsvr.DLSvrMain.<clinit>(DLSvrMain.java:27)
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 1 more

但是,如果我使用gradle构建fatjar,则fatjar无需指定任何类路径即可工作。 gradle中的依赖项语句如下:

dependencies 
{
    compile files("/home/ec2-user/dlsvr/lib/log4j-1.2.17.jar")
}

您忘记在类路径中包含log4j.jar

请参阅: java -jar选项是否会更改类路径选项

An executable JAR must reference all the other dependent JARs it requires through the Class-Path header of the manifest file. The environment variable CLASSPATH and any class path specified on the command line is ignored by the JVM if the -jar option is used.

是的,AbtPst是正确的。 这是一个类路径问题。

这是类似的问题。 java -jar选项是否会更改类路径选项

可执行JAR必须通过清单文件的Class-Path标头引用其所需的所有其他依赖JAR。 如果使用-jar选项,则JVM将忽略环境变量CLASSPATH和命令行上指定的任何类路径。

我的问题通过通过gradle在jar的清单文件中添加classpath得以解决。

jar {
  manifest {
    attributes(
      "Class-Path": configurations.compile.collect { it.getName() }.join(' '))
  }
}  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM