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(' '))
}
}
我正在 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(' '))
}
}