微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

与Java模块JPMS和Gradle一起使用时,log4j2配置出现问题

如何解决与Java模块JPMS和Gradle一起使用时,log4j2配置出现问题

我使用gradle创建了一个普通的Java项目,然后将该项目转换为使用Java模块。如果没有模块,则会提取项目根目录中的log4j2.xml

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

据我了解,在Java平台模块系统(JPMS)中[当我们尝试使用Module#getResourceAsstream访问资源时,不在与包匹配的路径下的资源(例如,根级资源) (位于模块根目录的/myfile.txt中),以及涉及到模块根目录的/meta-inf文件夹时,调用方模块也会自动使用该文件夹(如果我输入错了,请纠正我)。但是我不确定JPMS在决定要查找给定资源的模块时使用的方法(是全部?还是具有其他机制?)。

就我而言,我都导出并打开了该模块,只是为了检查是否是引起问题的原因。不幸的是,这不是原因

知道为什么会这样吗?

该问题的来源可在以下github存储库中找到

https://github.com/thekalinga/log4j2-config-gradle-jpms-issue

解决方法

我不能肯定地说,因为我还没有完全研究它,但是我猜想,与大多数其他库一样,Log4j 2 2.x也不完全支持JPMS。使用JPMS,每个模块都由其自己的ClassLoader管理。由于Log4j是自动模块,它将与所有其他自动模块组合在一起,但不会与“ true” JPMS模块组合在一起。这意味着,当Log4尝试在“类路径”上找到log4j2.xml时,它将仅找到位于其他自动模块中的文件,因为Log4j 2 2.x不支持在其他模块中定位文件。

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

Log4j 2 3.0的开发已经进行了一段时间。这样做的目的一直是完全支持JPMS,因此您应该期望它在最终发布时会起作用,但是要使Log4j之类的库完全支持JPMS,则需要进行大量工作。由于所有Log4j开发人员都在空闲时间支持它,因此找到足够的它来处理我们想要的任何事情都可能具有挑战性

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。