java.lang.ClassNotFoundException 使用 log4j

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")
}

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

参考: Does java -jar option alter classpath options

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 是正确的。这是一个 class 路径问题。

这里是类似的问题。 Does java -jar option alter classpath options

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

通过 gradle.

在 jar 的清单文件中添加 classpath 解决了我的问题
jar {
  manifest {
    attributes(
      "Class-Path": configurations.compile.collect { it.getName() }.join(' '))
  }
}