【问题标题】:Minimize an Uber Jar correctly, Using Shade-Plugin使用 Shade-Plugin 正确最小化 Uber Jar
【发布时间】:2012-02-07 16:33:39
【问题描述】:

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

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

但是这个特性没有考虑到 log4j.properties 文件中声明的类。因此,例如org.apache.log4j.appender.TimeAndSizeRollingAppender 不包含在 Uber-jar 中,即使它已在 log4j.properties 文件中声明。

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

我该如何解决这个问题?

【问题讨论】:

标签: java maven maven-plugin executable-jar


【解决方案1】:

此功能已添加到 1.6 版的 maven-shade-plugin(刚刚发布)。 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>

【讨论】:

  • Maven 文档的副本。
  • 你能支持“始终保持特定的类”选项吗?例如,配置列出要保留的特定类/掩码,maven-shade-plugin 会自动计算未使用的类?
  • @VladimirSitnikov 已编辑答案,我相信底部的包含过滤器应该可以包含特定的类。
  • 我不想手动找出我需要包含的所有类。例如,jarjar ant 插件会自动扫描使用的类,您需要做的就是指定 Main 类
  • maven-shade-plugin 已经扫描了项目的依赖关系,并在使用 &lt;minimizeJar&gt;true&lt;/minimizeJar&gt; 时自动包含然后。但是,当您的代码或依赖项使用动态类加载时,maven-shade-plugin 无法检测对动态加载的类的依赖项,因此您必须使用过滤器包含手动包含这些依赖项如此处所示。如果您不想这样做,请使用&lt;minimizeJar&gt;false&lt;/minimizeJar&gt; 并处理较大的阴影罐。这些是你的选择。
猜你喜欢
  • 2013-11-28
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
  • 2014-08-28
  • 2017-06-18
  • 1970-01-01
相关资源
最近更新 更多