Что у меня есть
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>
Журнал Appenders в моем 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>
Моя проблема
maven-shade-plugin
удаляет неиспользуемые классы при сборке Uber JAR, но не распознает ConsoleAppender
, DailyRollingFileAppender
или PatternLayout
как используемые, так как они только в log4j.xml
.
A Решение
В конфигурации 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
, и он мог бы выяснить, какие дополнительные классы используются.)