首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

基於 ProGuard Maven Plugin 的自定義代碼混淆插件:支援 JAR 與 WAR 雙格式輸出

     編輯:Java 綜合教學

專案背景與動機

在代碼敏感的專案中,防止反編譯洩露核心邏輯至關重要。官方 proguard-maven-plugin 僅支援 JAR 封裝混淆,無法直接處理 WAR 包。本專案在其基礎上擴充,實現構建階段同步混淆並支援 JAR/WAR 雙輸出格式。

核心修改點

1. 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 格式)的解壓與重新打包,支援目錄遞迴遍歷與項目複製。

2. 擴充 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 部署
}

使用指南

  1. 將插件專案 mvn clean install 安裝至本地倉庫
  2. 在目標專案 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>
  3. 專案根目錄新增 proguard.conf 配置保留規則(如 Controller、Entity、序列化類等)
  4. 執行 mvn clean package,產出 *-pg.war 混淆包

關鍵 ProGuard 參數說明

  • -keep class com.xxx.** { *; } 保留指定包下所有類與成員
  • -keepattributes SourceFile,LineNumberTable,*Annotation* 保留行號與註解,利於除錯與框架運行
  • -dontshrink -dontoptimize 僅混淆不壓縮/優化,穩定性優先
  • -ignorewarnings 忽略警告避免構建失敗
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved