组件打包常用工具-proguard-maven-plugin等

本文介绍了在Maven项目中使用ProGuard、maven-shade-plugin、maven-assembly-plugin、onejar-maven-plugin和maven-jar-plugin进行代码混淆及打包成可执行包的不同方法,包括配置选项和适用场景。

 1.proguard-maven-plugin

<plugin>
                <groupId>com.github.wvengen</groupId>
                <artifactId>proguard-maven-plugin</artifactId>
                <version>2.0.13</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>proguard</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <attach>true</attach>
                    <attachArtifactClassifier>pg</attachArtifactClassifier>
                    <!-- attach 的作用是在 install 与 deploy 时将生成的 pg 文件也安装与部署 -->
                    <options> <!-- 详细配置方式参考 ProGuard 官方文档 -->
                        <!--<option>-dontobfuscate</option>-->
                        <option>-ignorewarnings</option> <!--忽略所有告警-->
                        <option>-dontshrink</option>   <!--不做 shrink -->
                        <option>-dontoptimize</option> <!--不做 optimize -->
                        <option>-dontskipnonpubliclibraryclasses</option>
                        <option>-dontskipnonpubliclibraryclassmembers</option>
 
                        <option>-repackageclasses com.lwf.proguard.example.project2.pg</option>
                        <!--平行包结构(重构包层次),所有混淆的类放在 pg 包下-->
 
                        <!-- 以下为 Keep,哪些内容保持不变,因为有一些内容混淆后(a,b,c)导致反射或按类名字符串相关的操作失效 -->
 
                        <option>-keep class **.package-info</option>
                         <option>-keep class **.TestClass { *;}</option>
                        <!--保持包注解类-->
 
                        <option>-keepattributes Signature</option>
                        <!--JAXB NEED,具体原因不明,不加会导致 JAXB 出异常,如果不使用 JAXB 根据需要修改-->
                        <!-- Jaxb requires generics to be available to perform xml parsing and without this option ProGuard was not retaining that information after obfuscation. That was causing the exception above. -->
 
                        <option>-keepattributes SourceFile,LineNumberTable,*Annotation*</option>
                        <!--保持源码名与行号(异常时有明确的栈信息),注解(默认会过滤掉所有注解,会影响框架的注解)-->
 
                        <option>-keepclassmembers enum com.lwf.proguard.example.project2.** { *;}</option>
                        <!--保持枚举中的名子,确保枚举 valueOf 可以使用-->
 
                        <option>-keep class com.lwf.proguard.example.project2.bean.** { *;}</option>
                        <!--保持 Bean 类,(由于很多框架会对 Bean 中的内容做反射处理,请根据自己的业务调整) -->
 
                        <option>-keep class com.lwf.proguard.example.project2.Project2 { public void init(); public void
                            destroy(); }
                        </option>
                        <!-- 保持对外的接口性质类对外的类名与方法名不变 -->
 
                    </options>
                    <outjar>${project.build.finalName}-pg</outjar>
                    <libs>
                        <lib>${java.home}/lib/rt.jar</lib>
                    </libs>
 
                </configuration>
            </plugin>

2. maven-shade-plugin


        
<!-- 方法二:使用 maven-shade-plugin插件打可执行包-->
<!-- 
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.4.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.lwf.test.TestClass</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
-->             
 

3.maven-Assembly-plugin

<!-- 方法三:使用 maven-Assembly-plugin插件打可执行包-->
<!-- 
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                      <manifest>
                        <mainClass>com.lwf.test.TestClass</mainClass>
                      </manifest>
                    </archive>
                </configuration>
                <executions>
                  <execution>
                    <id>make-assembly</id>
                    <phase>package</phase> 
                    <goals>
                        <goal>single</goal>
                    </goals>
                  </execution>
                </executions>
            </plugin>
-->      
           

4.onejar-maven-plugin

<!-- 方法四:使用 onejar-maven-plugin插件打可执行包-->
<!--  		
			<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.lwf.test.TestClass</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>com.jolira</groupId>
                <artifactId>onejar-maven-plugin</artifactId>
                <version>1.4.4</version>
                <executions>
                    <execution>
                        <configuration>
                            <attachToBuild>true</attachToBuild>
                            <classifier>onejar</classifier>
                        </configuration>
                        <goals>
                            <goal>one-jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            
	 -->        

 

 5.mvaen-jar-plugin和 maven-dependency-plugin

	    
<!-- 方法五:使用maven-jar-plugin和maven-dependency-plugin打可执行包,引用的包放包外面文件夹下 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<configuration>
				  <excludes>
					<exclude>**/log4j.properties</exclude>
				  </excludes>
				  <archive>
				  	<!-- 包里面是否包含pom.xml文件和pom.properties文件 -->
				  	<addMavenDescriptor>false</addMavenDescriptor>
				    <manifest>
						<addClasspath>true</addClasspath>
						<mainClass>com.lwf.test.TestClass</mainClass>
						<classpathPrefix>lib/</classpathPrefix>
				    </manifest>
				  </archive>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-dependency-plugin</artifactId>
				<version>2.5.1</version>
				<executions>
				  <execution>
					<id>copy-dependencies</id>
					<phase>package</phase>
					<goals>
						<goal>copy-dependencies</goal>
					</goals>
					<configuration>
					 <!--  exclude junit, we need runtime dependency only -->
					  <includeScope>runtime</includeScope>
					  <outputDirectory>${project.build.directory}/lib/</outputDirectory>
					</configuration>
				  </execution>
				</executions>
			</plugin>      
			 
			 
			 <plugin>
                <groupId>com.github.wvengen</groupId>
                <artifactId>proguard-maven-plugin</artifactId>
                <version>2.0.13</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>proguard</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <attach>true</attach>
                    <attachArtifactClassifier>pg</attachArtifactClassifier>
                    <!-- attach 的作用是在 install 与 deploy 时将生成的 pg 文件也安装与部署 -->
                    <options> <!-- 详细配置方式参考 ProGuard 官方文档 -->
                        <!--<option>-dontobfuscate</option>-->
                        <option>-ignorewarnings</option> <!--忽略所有告警-->
                        <option>-dontshrink</option>   <!--不做 shrink -->
                        <option>-dontoptimize</option> <!--不做 optimize -->
                        <option>-dontskipnonpubliclibraryclasses</option>
                        <option>-dontskipnonpubliclibraryclassmembers</option>
 
                        <option>-repackageclasses com.lwf.proguard.example.project2.pg</option>
                        <!--平行包结构(重构包层次),所有混淆的类放在 pg 包下-->
 
                        <!-- 以下为 Keep,哪些内容保持不变,因为有一些内容混淆后(a,b,c)导致反射或按类名字符串相关的操作失效 -->
 
                        <option>-keep class **.package-info</option>
                         <option>-keep class **.TestClass { *;}</option>
                        <!--保持包注解类-->
 
                        <option>-keepattributes Signature</option>
                        <!--JAXB NEED,具体原因不明,不加会导致 JAXB 出异常,如果不使用 JAXB 根据需要修改-->
                        <!-- Jaxb requires generics to be available to perform xml parsing and without this option ProGuard was not retaining that information after obfuscation. That was causing the exception above. -->
 
                        <option>-keepattributes SourceFile,LineNumberTable,*Annotation*</option>
                        <!--保持源码名与行号(异常时有明确的栈信息),注解(默认会过滤掉所有注解,会影响框架的注解)-->
 
                        <option>-keepclassmembers enum com.lwf.proguard.example.project2.** { *;}</option>
                        <!--保持枚举中的名子,确保枚举 valueOf 可以使用-->
 
                        <option>-keep class com.lwf.proguard.example.project2.bean.** { *;}</option>
                        <!--保持 Bean 类,(由于很多框架会对 Bean 中的内容做反射处理,请根据自己的业务调整) -->
 
                        <option>-keep class com.lwf.proguard.example.project2.Project2 { public void init(); public void
                            destroy(); }
                        </option>
                        <!-- 保持对外的接口性质类对外的类名与方法名不变 -->
 
                    </options>
                    <outjar>${project.build.finalName}-pg</outjar>
                    <libs>
                        <lib>${java.home}/lib/rt.jar</lib>
                    </libs>
 
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

 

### Spring Boot 使用 Maven-Assembly-PluginProGuard 进行打包和混淆 #### 配置 `pom.xml` 为了实现Spring Boot项目的ProGuard混淆并使用`maven-assembly-plugin`进行打包,需调整`pom.xml`文件中的配置如下: ```xml <build> <plugins> <!-- ProGuard Plugin --> <plugin> <groupId>com.github.wvengen</groupId> <artifactId>proguard-maven-plugin</artifactId> <version>2.0.14</version> <executions> <execution> <phase>package</phase> <goals><goal>proguard</goal></goals> </execution> </executions> <configuration> <injar>${project.build.finalName}.jar</injar> <outjar>${project.artifactId}-${project.version}-obf.jar</outjar> <outputDirectory>${project.build.directory}</outputDirectory> <options> <option>-dontshrink</option> <option>-dontoptimize</option> <option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod</option> <option>-keep public class * extends org.springframework.boot.SpringApplication { public static void main(java.lang.String[]); }</option> <option>-adaptresourcefilecontents **.properties,META-INF/MANIFEST.MF</option> </options> <libs> <lib>${java.home}/lib/rt.jar</lib> <lib>${java.home}/lib/jce.jar</lib> </libs> </configuration> <dependencies> <dependency> <groupId>net.sf.proguard</groupId> <artifactId>proguard-base</artifactId> <version>6.2.2</version> <scope>runtime</scope> </dependency> </dependencies> </plugin> <!-- Assembly Plugin --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>fully.qualified.MainClass</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> <!-- Spring Boot Maven Plugin to ensure the final JAR is built correctly after obfuscation --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.7.5</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ``` 上述配置中,先利用`proguard-maven-plugin`对应用程序及其依赖项进行了混淆处理[^2]。接着,通过设置`maven-assembly-plugin`创建包含所有必要库的单一JAR文件,并指定了入口类以便可以直接执行该JAR文件。 值得注意的是,在实际操作前应确保已安装了适当版本的Java JDK环境以及正确设置了`JAVA_HOME`变量。此外,还需注意替换示例代码里的`fully.qualified.MainClass`为具体的应用程序主类路径。 对于某些特殊情况,可能需要进一步微调ProGuard选项以适应具体的业务逻辑或第三方库的要求。例如,如果项目中有特殊的反射机制或者其他动态加载方式,则应在ProGuard配置里加入相应的保留规则来防止这些部分被错误地移除或重命名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值