【发布时间】:2021-08-13 19:08:45
【问题描述】:
我正在尝试在我的 java 核心控制台应用程序中使用 log4j。在文档中有关于如何为 log4j 添加 Gradle 依赖项的示例代码:
https://logging.apache.org/log4j/2.x/maven-artifacts.html
dependencies {
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.14.1'
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.14.1'
}
我将它粘贴到我的build.gradle 文件中并编写了运行代码的示例代码。
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Program {
private static final Logger logger = LogManager.getLogger("HelloWorld");
public static void main(String[] args) {
logger.error("Just a test error entry");
}
}
除此之外,我还添加了清单以便从控制台运行代码。
jar {
manifest {
attributes "Main-Class": "Program"
}
}
如果我使用 Gradle 构建它 - 一切都会成功构建。但是如果我尝试从我的构建目录运行 java -jar 那么我得到了
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/logging/log4j/LogManager
at Program.<clinit>(Program.java:5)
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.LogManager
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:636)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:182)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:519)
... 1 more
我找到了 1 个解决方法:修改为 jar{} 部分:
jar {
manifest {
attributes "Main-Class": "Program"
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
它开始工作了,我什至尝试压缩 .jar 文件并看到添加了 log4j 依赖项。
但是什么是我不希望对 log4j 的传递依赖?如果我设置 implementation group 而不是 compile group 它就不会再工作了。有没有完整的使用 log4j 的例子?
最重要的是,要指出一点,虽然它不能与 java -jar <.jar> 一起使用,但由于某种原因,它仍然可以在 Intellij idea 中使用。谁能解释一下为什么?
【问题讨论】:
-
如果 JAR 文件需要外部依赖项,您需要使用
-cp参数到java可执行文件(或CLASSPATH环境变量)。或者,一些 Java 实现可以通过读取清单(参见this question)向类路径添加额外的 JAR -
@PiotrP.Karwasz,您能否分享有关此的任何文档?我已经阅读了 gradle 文档,但没有发现我们应该指定类路径等以使用
implementation -
见What is a classpath and how do I set it? 当 Intellij 运行一个项目时,它会做一些类似于设置类路径的事情。
-
@PiotrP.Karwasz,对不起,我在 Gradle 中找不到任何关于它的文档。我看到了链接,但是我应该告诉我的
build.gradle什么类路径?因为如果我输入implementation,在我构建的 .jar 中没有 log4j jar。只有当我输入compile。我已经读过它们在传递依赖关系中的区别,但可能还有别的东西。让我感到不安的是 - 没有关于它的文档。
标签: java gradle dependencies log4j log4j2