仅包装来自依赖项的必要类

时间:2015-06-04 23:04:12

标签: java maven dependencies packaging

如何使用maven shade或assembly插件自动确定依赖jar中需要哪些类,并将这些类复制到构建中。到目前为止,我没有运气让它自动找到我的构建所需的类。

我可以使用 minimizeJar 并包含和排除标记来指定添加哪些类但我真正希望它做的是某事,如下所示:

将我所有类的所有导入复制到jar中,并复制所有他们的导入及其所有导入的导入等等。

我是否认为这个问题都错了?我如何让maven根据使用的进口自动最小化jar大小? (请不要只说这个maven插件)因为我已经走到了尽头,我需要一个例子来说明要添加到我的pom中以完成这些任务。

1 个答案:

答案 0 :(得分:2)

ProGuard可以删除未使用的类甚至更多。

  

ProGuard是一个免费的Java类文件收缩器,优化器,混淆器和预处理器。它检测并删除未使用的类,字段,方法和属性。它优化字节码并删除未使用的指令。它使用简短的无意义名称重命名剩余的类,字段和方法。

首先,您应该打包一个带有依赖项的jar。可以使用maven-assembly-plugin轻松完成:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.5.4</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>com.test.HelloWorld</mainClass>
            </manifest>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id> 
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

然后配置proguard以优化生成的jar。对于maven项目,请使用proguard-maven-plugin

<plugin>
    <groupId>com.github.wvengen</groupId>
    <artifactId>proguard-maven-plugin</artifactId>
    <version>2.0.10</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals><goal>proguard</goal></goals>
        </execution>
    </executions>
    <configuration>        
        <injar>${project.build.finalName}-jar-with-dependencies.jar</injar>
        <outjar>${project.build.finalName}-small.jar</outjar>
        <outputDirectory>${project.build.directory}</outputDirectory>
        <options>
            <option>-dontobfuscate</option>
            <option>-dontwarn com.google.**</option>
            <option>-keep public class com.test.HelloWorld {public static void main(java.lang.String[]);}</option>
        </options>
        <libs>
            <lib>${java.home}/lib/rt.jar</lib>
        </libs>
    </configuration>
</plugin>

执行这些步骤后

mvn clean install

并检查target/<artifact name>-small.jar - 它应该只包含在运行时实际使用的类。

请注意,如果您的代码或依赖项使用反射,可能会出现一些问题。