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

Sup*_*ure 6 java dependencies packaging maven

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

我可以使用minimizeJar,包括和排除标签来指定哪些会添加类,但我真的希望它做的是事情是这样的:

将我所有类的所有导入复制到jar中,并复制所有导入及其所有导入的导入,依此类推.

我在想这个问题都错了吗?我怎样才能让maven根据使用的进口量自动最小化jar大小?(请不要只说这个maven插件)因为我已经走到了尽头,我需要一个例子来说明要添加到我的pom中以完成这些任务.

小智 5

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>
Run Code Online (Sandbox Code Playgroud)

然后配置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>
Run Code Online (Sandbox Code Playgroud)

运行这些步骤后

mvn clean install
Run Code Online (Sandbox Code Playgroud)

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

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