与Java模块(JPM)一起使用时出现log4j2配置问题&;格拉德尔

与Java模块(JPM)一起使用时出现log4j2配置问题&;格拉德尔,java,gradle,log4j2,java-module,java-platform-module-system,Java,Gradle,Log4j2,Java Module,Java Platform Module System,我使用gradle创建了一个香草java项目&然后将该项目转换为使用java模块。如果没有模块,将拾取项目根目录下的log4j2.xml 但是,一旦我将应用程序转换为基于模块的系统,框架将使用自己的默认配置,而不是选择log4j2.xml 我的理解是,在Java平台模块系统(JPMS)[当我们尝试使用模块#getResourceAsStream访问资源时,不在与包匹配的路径下的资源(例如模块根目录下的/myfile.txt中的根级别资源)当涉及到/META-INF时,模块根目录下的文件夹将自动提

我使用gradle创建了一个香草java项目&然后将该项目转换为使用java模块。如果没有模块,将拾取项目根目录下的
log4j2.xml

但是,一旦我将应用程序转换为基于模块的系统,框架将使用自己的默认配置,而不是选择log4j2.xml

我的理解是,在Java平台模块系统(JPMS)[当我们尝试使用
模块#getResourceAsStream
访问资源时,不在与包匹配的路径下的资源(例如模块根目录下的
/myfile.txt
中的根级别资源)当涉及到
/META-INF时,
模块根目录下的文件夹将自动提供给调用方模块(如果我错了,请纠正我)。但我不确定JPMS在决定查找给定资源的模块时使用的方法(是否全部?或者是否有其他机制?)

在我的例子中,我导出并打开模块只是为了检查这是否是导致问题的原因。不幸的是,这不是原因

你知道为什么会这样吗

问题的来源可以在以下github repo中找到


我不能肯定地说,因为我还没有对它进行全面的研究,但我的猜测是,与大多数其他库一样,Log4j 2.x并不完全支持JPMS。对于JPMS,每个模块都由自己的类加载器管理。由于Log4j是一个自动模块,它将与所有其他自动模块分组,但不使用“true”JPMS模块。这意味着当Log4试图在“classpath”上定位log4j2.xml时,它将只找到位于其他自动模块中的文件,因为log4j2 2.x不支持定位其他模块中的文件

如果您的应用程序被定义为JPMS模块(即带有module-info.class文件),那么Log4j将无法找到位于其中的配置文件


Log4j 2 3.0开发已经进行了相当长的一段时间。它的目的一直是完全支持JPMS,所以您应该期望它最终发布时会起作用,但是让Log4j这样的库完全支持JPMS需要相当多的工作。因为所有Log4j开发人员在空闲时间都支持它,所以找到足够的资源要想在我们想要的任何东西上工作都是很有挑战性的

谢谢。v3版本是否可以公开访问?您可以在快照存储库的repository.apache.org上找到3.0.0的快照版本。但是,您应该知道,对JPMS的支持离实现还有很长的路要走。如果您愿意帮助,欢迎使用补丁和请求!谢谢或者共享该MRE。观察您描述的问题的步骤是什么?执行
/gradlew check
成功,没有程序输出。执行
/gradlew run
会导致:“
在根项目“log4j2香草”中找不到任务“run”
”。我正在阅读您的问题(下载您的MRE之前)我有一种预感是什么导致了你所描述的。但是不能重现你所描述的使这成为一个非初学者。你能编辑你的问题(或你的github自述)吗为了包含重现问题的步骤?或重构MRE以产生您描述的输出?TIA。在您的repo中,您写道:“只有
错误消息
被记录,而不是
调试消息
“。这个问题引起了我的兴趣,因为我在几个不同的基于JPMS的Gradle项目中使用了log4j 2,但从未见过您所描述的内容。您的问题和回复缺乏有关如何运行应用程序的详细信息。因此我采取了一些主动,将
id'application'
应用到您的
插件{…}
block.Calling
/gradlew run
打印:“
…DEBUG 6312-[main]c.e.Play:DEBUG MSG |…ERROR 6312-[main]c.e.Play:ERROR MSG
”。使用
java…-m com.example/com.example.Play直接调用模块化jar打印相同的内容。