Log4J2 动态附加程序不适用于 maven-shade-plugin(或解压缩的 jar)

问题描述 投票:0回答:2

编辑 - 现在遮阳罐(场景 2)起作用了,所以我解决了这个问题。我会发布答案解决方案。

我以编程方式添加一个附加程序。在我添加

maven-shade-plugin
之前,它一直在工作。我想知道是什么让我的 appender 失败了。

调查,我注意到当通过文件夹(解压缩的 jars)包含 log4j 类时,appender 也会失败。

简而言之,appender 在这些场景中工作 ✅ 或不工作 ❌:

  1. ✅ 来自 IDE (IntelliJ IDEA)
  2. ❌ 使用遮光罐(所有东西都装在一个罐子里)-> 现在可以用了!
  3. ✅ 带有单独的罐子(应用罐子、log4j 罐子)
  4. ❌ 将应用程序 jar 和 log4j jar 解压缩到一个文件夹中
  5. ✅ 使用 app jar 和重新压缩的 log4j 文件夹

示例项目

使用上面的示例项目重现场景

mvn clean compile
mkdir -p local/log4j-jars
unzip $HOME/.m2/repository/org/apache/logging/log4j/log4j-api/2.17.2/log4j-api-2.17.2.jar -d local/log4j-jars
unzip -o $HOME/.m2/repository/org/apache/logging/log4j/log4j-core/2.17.2/log4j-core-2.17.2.jar -d local/log4j-jars
cd local/log4j-jars
zip -r ../log4j-jars.zip .
cd ../..

# Scenario 2 ❌ uses fat jar - works now!
java -cp "target/log4j-test-1.0-SNAPSHOT.jar" org.example.Main

# Scenario 3 ✅ uses separate jars
java -cp "target/original-log4j-test-1.0-SNAPSHOT.jar:$HOME/.m2/repository/org/apache/logging/log4j/log4j-core/2.17.2/log4j-core-2.17.2.jar:$HOME/.m2/repository/org/apache/logging/log4j/log4j-api/2.17.2/log4j-api-2.17.2.jar" org.example.Main

# Scenario 4 ❌ uses log4j files unzipped
java -cp "target/original-log4j-test-1.0-SNAPSHOT.jar:local/log4j-jars" org.example.Main

# Scenario 5 ✅ uses log4j files re-zipped
java -cp "target/original-log4j-test-1.0-SNAPSHOT.jar:local/log4j-jars.zip" org.example.Main

补充说明

在场景 5 中,我注意到我可以删除

META-INF
中的一些文件,但是为了让我的 appender 工作,我需要保留以下内容:

  • META-INF
    • org
      (包含
      Log4j2Plugins.dat
    • services
      (没有这个,应用程序甚至会崩溃)
    • versions
    • MANIFES.MF

相关问题

java maven log4j2
2个回答
0
投票

我认为这个插件有效,因为它生成了一个有效的

MANIFEST.MF
.

AFAIK,

maven-shade-plugin
META-INF
中正确生成所需的文件(请参阅问题中的“附加说明”)。但是 (log4j) 罐子的
MANIFEST.MF
丢失了。该转换器为其收集必要的条目。

https://github.com/marcosemiao/maven-shade-merge-manifest-transformer


0
投票

经过更多调查,我向示例项目 log4j2-thread-context 添加了一个新提交并进行了修复,所以现在它工作正常。

我还添加了另一个我需要的修复程序,但我没有在我的问题中提到它。总结:

  • 我们需要一个正确的
    Log4j2Plugins.dat
    ,所以我复制正确的
  • 我们需要在结果
    Multi-Release
    中的
    METAFILE.MF
    条目。

也许有人可以解释

Multi-Release
条目。

© www.soinside.com 2019 - 2024. All rights reserved.