xml - 当 maven-shade-plugin 最小化 jar 时,如何包含 log4j.xml 中的类?
问题描述
我有的
maven-shade-plugin
我的配置pom.xml
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<minimizeJar>true</minimizeJar>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>runnable</shadedClassifierName>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.Main</mainClass>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
</transformers>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals><goal>shade</goal></goals>
</execution>
</executions>
</plugin>
在我的日志附加器log4j.xml
:
<appender name="ROLLING-LOG" class="org.apache.log4j.DailyRollingFileAppender">
<param name="file" value="${logFileName}" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %p [%c] - %m%n" />
</layout>
</appender>
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<param name="target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %p [%c] - %m%n" />
</layout>
</appender>
我的问题
构建 uber jar 时会删除未使用的maven-shade-plugin
类,但它无法识别ConsoleAppender
、DailyRollingFileAppender
或PatternLayout
正在使用的类,因为它们仅在log4j.xml
.
一个解法
在maven-shade-plugin
配置中,我添加了一个过滤器来强制包含整个 log4j jar。这是一个简单的解决方案,但最终包含的内容超出了我的需要。
<filter>
<artifact>log4j:log4j</artifact>
<includes>
<include>**</include>
</includes>
</filter>
更好的解决方案
在Main.java
中,我包含了这些类,以便将它们识别为正在使用。
static {
@SuppressWarnings("unused")
Class<?>[] classes = new Class<?>[]{
org.apache.log4j.ConsoleAppender.class,
org.apache.log4j.DailyRollingFileAppender.class,
org.apache.log4j.PatternLayout.class
}
}
我的问题
有没有更好的方法来做到这一点?(我希望有一个 XML 转换器或我可以给我的东西,log4j.xml
它能够弄清楚使用了哪些额外的类。)
解决方案
推荐阅读
- javascript - 如何在 React 中的 div 下单击(或模拟单击)?
- java - 如何排除某些属性被序列化
- python - 使用 model.predict() 显示准确度和损失
- gcc - 不在同一个编译单元中的 gcc 或 clang 内联函数可以吗?
- c - C waitpid,这是矛盾的吗?
- python - 破折号扩展问题下载生成为字节流的 PDF 文件
- java - 当我们从命令提示符键入 software -version 时如何返回版本
- android - Android BLE 配对后自动重新连接
- java - 打印日期范围从 1910 年 1 月 1 日到 2025 年 12 月 30 日
- alfresco - 在 Alfresco ADF 中链接 sidenav 和树视图组件