java - 仅打包依赖项中必要的类

标签 java maven dependencies packaging

我如何使用 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/

相关文章:

java - 在多模块maven项目中指定公共(public)资源

java - 如何在 Parquet 文件中创建嵌套对象和数组?

java - IntelliJ CheckerFramework 插件

android - flutter :第一次运行我的 flutter 应用程序时出现gradle错误

java - 使用 Gradle 防止第 3 方库位于编译类路径上

java - 使用 Split 将所有新元素添加到带有混合输入的 ArrayList 中。

java - 正则表达式拆分字符串上的转义序列无效

Java 8、Base64.Decoder编译

java - Maven 程序集依赖程序集?

java - Maven 执行器插件和缺少的依赖项