如何使用maven shade或assembly插件自动确定依赖jar中需要哪些类,并将这些类复制到构建中。到目前为止,我没有运气让它自动找到我的构建所需的类。
我可以使用 minimizeJar 并包含和排除标记来指定添加哪些类但我真正希望它做的是某事,如下所示:
将我所有类的所有导入复制到jar中,并复制所有他们的导入及其所有导入的导入等等。
我是否认为这个问题都错了?我如何让maven根据使用的进口自动最小化jar大小? (请不要只说这个maven插件)因为我已经走到了尽头,我需要一个例子来说明要添加到我的pom中以完成这些任务。
答案 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
- 它应该只包含在运行时实际使用的类。
请注意,如果您的代码或依赖项使用反射,可能会出现一些问题。