在代碼敏感的專案中,防止反編譯洩露核心邏輯至關重要。官方 proguard-maven-plugin 僅支援 JAR 封裝混淆,無法直接處理 WAR 包。本專案在其基礎上擴充,實現構建階段同步混淆並支援 JAR/WAR 雙輸出格式。
WarUtils)public class WarUtils {
public static void unzip(String warPath, String unzipPath) { ... }
public static void zip(String destFile, String zipDir) { ... }
}
使用 Apache Commons Compress 處理 WAR(本質為 ZIP/JAR 格式)的解壓與重新打包,支援目錄遞迴遍歷與項目複製。
ProGuardMojo.java 打包流程if (attach && !sameArtifact) {
String absolutePath = outJarFile.getAbsolutePath();
String unzipPath = outJarFile.getParent() + "/proguard-war";
// 1. 刪除舊暫存目錄
// 2. 解壓原始 WAR 至暫存目錄
// 3. 刪除 WEB-INF/classes
// 4. 將混淆後的 classes 解壓覆蓋
// 5. 刪除原混淆 JAR
// 6. 重新打包為 WAR
// 7. attachArtifact 部署
}
mvn clean install 安裝至本地倉庫pom.xml 引入插件:
<plugin>
<groupId>com.jiujie</groupId>
<artifactId>code-hidding-plugin</artifactId>
<version>1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals><goal>proguard</goal></goals>
</execution>
</executions>
<configuration>
<obfuscate>true</obfuscate>
<attach>true</attach>
<injar>classes</injar>
<attachArtifactClassifier>pg</attachArtifactClassifier>
<proguardInclude>${basedir}/proguard.conf</proguardInclude>
<outjar>${project.build.finalName}-pg</outjar>
<libs>
<lib>${java.home}/lib/rt.jar</lib>
<lib>${java.home}/lib/jsse.jar</lib>
</libs>
<addMavenDescriptor>false</addMavenDescriptor>
</configuration>
</plugin>
proguard.conf 配置保留規則(如 Controller、Entity、序列化類等)mvn clean package,產出 *-pg.war 混淆包-keep class com.xxx.** { *; } 保留指定包下所有類與成員-keepattributes SourceFile,LineNumberTable,*Annotation* 保留行號與註解,利於除錯與框架運行-dontshrink -dontoptimize 僅混淆不壓縮/優化,穩定性優先-ignorewarnings 忽略警告避免構建失敗