配置Maven Shade minimizeJar以包含类文件

时间:2012-01-02 08:33:40

标签: java maven jar

我正在尝试使用Maven Shade Plugin的{​​{1}}来最小化UberJar的大小。看起来minimizeJar只包含在代码中静态导入的类(我怀疑这是因为我在minimizeJar的uber jar中看到了LogFactory.class但是没有org\apache\commons\logging\包的类包括在内,因此当我运行uber-jar时抛出impl

有什么方法可以告诉Maven的Shade插件将指定的包包含到最终的jar中,无论java.lang.ClassNotFoundException: org.apache.commons.logging.impl.LogFactoryImpl建议什么?

这是我正在尝试的pom片段:

minimizeJar

2 个答案:

答案 0 :(得分:14)

此功能已添加到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>

答案 1 :(得分:10)

我使用的是Maven Shade插件的2.0版本,但在“最小化”JAR之后我仍然无法包含类。

作为一种解决方法,我唯一想到的就是创建对所需类的引用,以避免最小化代码摆脱它们。即:

/*
 * This block prevents the Maven Shade plugin to remove the specified classes
 */
static {
    @SuppressWarnings ("unused") Class<?>[] classes = new Class<?>[] {
        JButton.class,
        JMenu.class,
        JMenuBar.class,
        JMenuItem.class
    };
}

我希望Maven开发人员能够实现一种处理这种情况的方法(我猜这很常见)。