我如何使用 maven shade 或 assembly 插件自动确定依赖 jar 中需要哪些类,并仅将这些类复制到构建中。到目前为止,我还没有运气让它自动找到我的构建需要哪些类。
我可以使用 minimizeJar 和 include 和 exclude 标签来指定添加哪些类,但我真正想让它做的是一些,如下所示:
将我所有类的所有导入复制到 jar 中,并复制所有它们的 导入,以及它们的所有导入的导入等等。
是不是我想的问题全错了?我怎样才能让 Maven 根据使用的导入自动最小化 jar 大小? (请不要只说这个 maven 插件)因为我已经走到了尽头,我需要一个例子来说明要添加到我的 pom 中以完成这些任务。
最佳答案
ProGuard可以删除未使用的类甚至更多。
ProGuard is a free Java class file shrinker, optimizer, obfuscator, and preverifier. It detects and removes unused classes, fields, methods, and attributes. It optimizes bytecode and removes unused instructions. It renames the remaining classes, fields, and methods using short meaningless names.
首先,你应该打包一个带有依赖项的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
- 它应该只包含在运行时实际使用的类。
请注意,如果您的代码或依赖项使用反射,可能会出现一些问题。
关于java - 仅打包依赖项中必要的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30655675/