编辑 - 现在遮阳罐(场景 2)起作用了,所以我解决了这个问题。我会发布答案解决方案。
我以编程方式添加一个附加程序。在我添加
maven-shade-plugin
之前,它一直在工作。我想知道是什么让我的 appender 失败了。
调查,我注意到当通过文件夹(解压缩的 jars)包含 log4j 类时,appender 也会失败。
简而言之,appender 在这些场景中工作 ✅ 或不工作 ❌:
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
Log4j2Plugins.dat
的问题,但在我的项目中只有一个文件,在 log4j2-core
.我认为这个插件有效,因为它生成了一个有效的
MANIFEST.MF
.
AFAIK,
maven-shade-plugin
在META-INF
中正确生成所需的文件(请参阅问题中的“附加说明”)。但是 (log4j) 罐子的 MANIFEST.MF
丢失了。该转换器为其收集必要的条目。
https://github.com/marcosemiao/maven-shade-merge-manifest-transformer
经过更多调查,我向示例项目 log4j2-thread-context 添加了一个新提交并进行了修复,所以现在它工作正常。
我还添加了另一个我需要的修复程序,但我没有在我的问题中提到它。总结:
Log4j2Plugins.dat
,所以我复制正确的Multi-Release
中的METAFILE.MF
条目。也许有人可以解释
Multi-Release
条目。