配置 Maven Shade minimizeJar 以包含类文件

2022-09-03 12:37:13

我正在尝试通过使用的.来最小化UberJar的大小。它看起来只包括在代码中静态导入的类(我怀疑这是因为我在uber jar中看到,但没有包含包的类,因此当我运行uber-jar时抛出)。Maven Shade PluginminimizeJarminimizeJarLogFactory.classorg\apache\commons\logging\impljava.lang.ClassNotFoundException: org.apache.commons.logging.impl.LogFactoryImpl

有没有办法告诉Maven的Shade插件将指定的软件包包含在最终的jar中,无论建议如何?minimizeJar

以下是我正在尝试的 pom 片段:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>1.5</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
                <configuration>
                    <minimizeJar>true</minimizeJar>
                    <filters>
                        <filter>
                            <artifact>commons-logging:commons-logging</artifact>
                            <includes>
                                <include>org/apache/commons/logging/**</include>
                            </includes>
                        </filter>    
                    </filters>
                    <transformers>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                            <mainClass>com.myproject.Main</mainClass>
                        </transformer>
                    </transformers>                            
                </configuration>
            </execution>
        </executions>
    </plugin>

答案 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>

答案 2

我正在使用2.0版本的Maven Shade插件,但在“最小化”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开发人员实现一种方法来处理这种情况(我想这很常见)。


推荐