使用Shade-Plugin正确地最小化Uber Jar

sum*_*ulb 25 java executable-jar maven-plugin maven

我正在使用Maven-Shade-Plugin来创建一个可运行的Uber-jar.根据本页的最后一帧,可以通过使用以下方式最小化jar的大小:

<configuration>
      <minimizeJar>true</minimizeJar>
</configuration>
Run Code Online (Sandbox Code Playgroud)

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

我相信我会遇到与Spring相同的问题.如果我的代码仅引用接口A并且我的Spring文件包含实现A的类B的实例化,那么B可能不会被添加到jar中,因为它不在代码中.

我怎么解决这个问题?

Sha*_*ane 31

此功能已添加到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>
Run Code Online (Sandbox Code Playgroud)

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

<filter>
  <artifact>org.yourorg:your-artifact</artifact>
  <includes>
    <include>org/yourorg/yourartifact/api/*</include>
    <include>org/yourorg/yourartifact/util/*</include>
  </includes>
</filter>
Run Code Online (Sandbox Code Playgroud)

  • 是的,我写了这个答案并同时更新了Maven文档...... (31认同)
  • maven-shade-plugin已经扫描了一个项目的依赖项,然后在使用`<minimizeJar> true </ minimizeJar>`时自动包含.但是,当您的代码或depdendency使用动态类加载时,maven-shade-plugin无法检测对动态加载的类的依赖性,因此您必须**使用过滤器包含手动包含这些依赖项,如此处所示.如果你不想这样做,请使用`<minimizeJar> false </ minimizeJar>`并处理更大的阴影jar.这些是你的选择. (3认同)