当 maven-shade-plugin 最小化 jar 时,如何包含 log4j.xml 中的类?

NoB*_*ner 6 xml log4j maven maven-shade-plugin

我拥有的

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>
Run Code Online (Sandbox Code Playgroud)

将 Appender 记录在我的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>
Run Code Online (Sandbox Code Playgroud)

我的问题

maven-shade-plugin在构建 uber jar 时会删除未使用的类,但它不会识别、ConsoleAppenderDailyRollingFileAppenderPatternLayout因为它们仅位于log4j.xml.

一个办法

maven-shade-plugin配置中,我添加了一个过滤器以强制包含整个 log4j jar。这是一个简单的解决方案,但它最终包含的内容超出了我的需要。

<filter>
  <artifact>log4j:log4j</artifact>
  <includes>
    <include>**</include>
  </includes>
</filter>
Run Code Online (Sandbox Code Playgroud)

更好的解决方案

在 中Main.java,我包含了这些类,以便它们被识别为正在使用。

static {
    @SuppressWarnings("unused")
    Class<?>[] classes = new Class<?>[]{
        org.apache.log4j.ConsoleAppender.class,
        org.apache.log4j.DailyRollingFileAppender.class,
        org.apache.log4j.PatternLayout.class
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题

有更好的方法吗?(我希望有一个 XML 转换器或者我可以给我的东西log4j.xml,它能够找出使用了哪些附加类。)