4

我有一个 Java 8 项目,我的配置文件在资源文件夹中,一切正常。现在我切换到Java 9,添加了对 的要求log4j.api,并且找不到配置文件了。

我是否需要在我的module-info文件中添加其他内容以便记录器找到它的配置?

目前是这样的

module project.main {
    requires jdk.incubator.httpclient;
    requires jackson.databind;
    requires jackson.core;
    requires jackson.annotations;
    requires log4j.api;
}

项目结构如下:

结构体

build.gradle 文件如下:

在此处输入图像描述

4

1 回答 1

3

log4j~faq建议至少使用log4j-api-2.xand log4j-core-2.x。最好将这些添加到您的build.gradle文件中:

compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.9.0'
compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.9.0'
compile group: 'org.apache.logging.log4j', name: 'log4j-1.2-api', version: '2.9.0'

并确保排除冲突的依赖项


module-info.java进一步你应该更新(这是我在自定义 maven 项目中所做的)

requires log4j; // not log4j.api

它也应该适用于您,并且具有相同的目录结构。


提示:这是我开始调试它的地方。 为什么我会看到有关“找不到记录器的附加程序”和“请正确配置 log4j”的警告?

当无法找到默认配置文件log4j.properties和 log4j.xml 并且应用程序未执行显式配置时,会发生这种情况。log4j 用于Thread.getContextClassLoader().getResource() 定位默认配置文件,不直接检查文件系统...

在方法中放置一个调试点,ClassLoader#getResource并密切关注库查找的资源。


还要提出有关资源的观点,如JDK-8142968resources/foo/bar/log4j.properties中的发行说明中所述

  • 标准和 JDK 模块中的 JDK 内部资源(类文件除外)不能再通过 ClassLoader.getResourceXXXAPI 定位。这可能会影响依赖使用这些 API 来获取 JDK 内部属性文件或其他资源的代码。

并得到以下 java-doc 的支持ClassLoader#getResource

  • 命名模块中的资源受Module.getResourceAsStream. 此外,除了资源名称以“.class”结尾的特殊情况外,该方法只会在无条件打开包的情况下查找命名模块包中的资源(即使该方法的调用者在同一模块作为资源)。
于 2017-09-10T12:27:19.530 回答