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)。
我正在将一个 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)。