我正在使用Maven-Shade-Plugin来创建一个可运行的Uber-jar。 根据{{3}}上的最后一帧,可以使用以下方法最小化jar的大小:
<configuration>
<minimizeJar>true</minimizeJar>
</configuration>
但是这个功能没有考虑log4j.properties文件中声明的类。因此,例如org.apache.log4j.appender.TimeAndSizeRollingAppender
未包含在Uber-jar中,即使它已在log4j.properties文件中声明。
我相信我会遇到与Spring相同的问题。如果我的代码只引用接口A而我的Spring文件包含实现A的B类实例化,那么B可能不会被添加到jar中,因为它不在代码中。
我该如何解决这个问题?
答案 0 :(得分: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>
要仅包含特定类,请使用过滤器中类名中的路径斜杠将它们添加为包含(同样,将自动排除未包含的类)。
<filter>
<artifact>org.yourorg:your-artifact</artifact>
<includes>
<include>org/yourorg/yourartifact/api/*</include>
<include>org/yourorg/yourartifact/util/*</include>
</includes>
</filter>