使用Shade插件正确最小化Uber Jar

2022-09-01 12:01:35

我正在使用Maven-Shade-Plugin来创建一个可运行的Uber-jar。根据此页面上的最后一帧,可以使用以下命令将 jar 的大小最小化:

<configuration>
      <minimizeJar>true</minimizeJar>
</configuration>

但此功能不考虑 log4j.properties 文件中声明的类。因此,例如 不包含在 Uber-jar 中,即使它在 log4j.properties 文件中声明。org.apache.log4j.appender.TimeAndSizeRollingAppender

我相信我会在春天面临同样的问题。如果我的代码仅引用接口 A,而我的 Spring 文件包含实现 A 的类 B 的实例化,则可能不会将 B 添加到 jar 中,因为它不在代码中。

我该如何解决这个问题?


答案 1

此功能已添加到 maven-shade-plugin(刚刚发布)的 1.6 版中。minimizeJar 现在不会删除专门包含在过滤器中的类。请注意,在筛选器中包含项目的某些类将排除该项目的非指定类,因此请确保包括所需的所有类。

下面是一个示例插件配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>1.6</version>    
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>                        
            <configuration>
                <minimizeJar>true</minimizeJar>    
                <filters> 
                    <filter>
                       <artifact>log4j:log4j</artifact>
                       <includes>
                           <include>**</include>
                       </includes>
                    </filter> 
                    <filter>
                       <artifact>commons-logging:commons-logging</artifact>
                       <includes>
                           <include>**</include>
                       </includes>
                    </filter>                      
                </filters>
            </configuration>
        </execution>
    </executions>
</plugin>

若要仅包含特定类,请在筛选器的类名中使用路径斜杠将它们添加为包含(同样,将自动排除未包含的类)。

<filter>
  <artifact>org.yourorg:your-artifact</artifact>
  <includes>
    <include>org/yourorg/yourartifact/api/*</include>
    <include>org/yourorg/yourartifact/util/*</include>
  </includes>
</filter>

答案 2

推荐