Log4j2:如何说服它确实存在 log4j-core.jar 的 类?

Log4j2: How to convince it that log4j-core.jar's classes are indeed present?

我正在将一个 Java 应用程序构建到单个可执行 .jar 文件中,以便我解压缩该应用程序所依赖的所有必需的 jar 文件,并将它们的所有内容与实际应用程序的 class将文件放入单个 .jar 文件中(恕我直言,这是 classic ant jar 任务的一个非常方便的功能。这样就不需要处理或分发多个 jar 或嵌套的 .jars 等)。

到目前为止,这种方法一切正常,但现在我从 log4j(v1) 升级到 log4j2(我实际上使用的是 slf4j-API,但下面的 log4j 版本发生了变化)。

自从升级后,我的方法似乎不再有效,但在运行时我不断收到错误消息: ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console....

但是,所有 log4j-core-class 文件version.jar 包含在我的.jar 文件! 显然,一些代码试图验证原始 .jar 文件的存在(并且没有意识到包含的 classes 确实存在并且在 class 路径上)然后大喊大叫。

我正在使用 log4j-slf4j-impl-2.13.1.jar, slf4j-api-1.7.25.jar, log4j-api-2.13.1.jar 和 log4j-core-2.13.1.jar(或者更确切地说 - 如上所述 - 只是它们的内容,而不是实际的 .jars)。

有没有办法避免这种情况并告诉日志记录代码不要再打扰。那个.jar 的存在?我不想不得不处理并且总是因为这个而分发两个 .jar 文件。

Jar 文件不仅仅包含 类。它们还可以包含资源。 Log4j 2 插件系统使用一个文件来标识 jar 中的所有插件,java.util.ServiceLoader 使用一个文件来标识服务的所有实现。没有这些文件,东西就会中断。

假设您正在使用 Maven 阴影插件,您需要使用 log4j shade transformer for plugins to be recognized and the ServicesResourceTransformer

发出我的问题后,我突然怀疑:检查 ​​log4j-core 是否存在的代码可能会检查 jar 的 MANIFEST 文件夹中的内容!?! 最初,我总是省略了包含的 .jars 的整个 META-INF 文件夹,以免被复制到生成的新 all-in-one.jar 文件中。现在我只排除那些包含的 .jars 的实际 MANIFEST.MF 文件,并且 - 惊喜,惊喜 - 现在 log4j 代码工作并且不再抱怨。我没有准确测试 什么 文件有所不同,但显然将那些额外的文件留在其中是神奇的咒语(现在有一个名为 "services" 的目录和另一个名为 "versions",每个文件都在组合的 .jar 中,还有一堆 pom 文件和一个 Log4j2Plugins.dat)。