簡體   English   中英

使用 ProGuard 從 lib 文件夾中排除混淆的 jar

[英]Exclude obfuscated jar from lib folder with ProGuard

我在我的多模塊 maven 項目中使用 proguard-maven-plugin 並啟動 spring。 絕不,我不是專家,還在學習如何使用 ProGuard 提供的所有功能,所以請多多包涵。 ProGuard 依賴:

<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.1.1</version>

最終產品是一個.jar 文件,它依賴於具有核心功能的成功混淆模塊。 產品jar和maven編譯打包后,其結構如下(使用jd-gui-1.6.6查看產品jar內容):

BOOT-INF
|_classes
  |_com.my.package
    |_a(ObfuscatedModule package after obfuscation)
      |_b.class
      |_c.class
      |_...
    |_Main.class
  |_...
|_lib
  |_ObfuscatedModule.jar
    |_NonObfuscatedClass1.class
    |_NonObfuscatedClass2.class
    |_NonObfuscatedClass3.class
    |_...
META-INF
org.springframework.boot.loader

由於混淆的目的是隱藏具有核心功能的模塊,因此我還想從產品 jar 內的 lib 目錄中排除。 在經歷了proguard示例之后,我還沒有找到方法。 是否可以在/lib中排除或至少混淆 core.jar 模塊?

編輯:我試圖通過使用 maven-shade-plugin 繞過生成具有依賴關系的單獨文件夾,創建一個 uber JAR。 使用時,它將所有依賴項添加到類路徑中,然后使用 ProGuard 插件來混淆需要混淆的內容。 項目結構看起來令人滿意,依賴項添加到類路徑並正確混淆。 但是當我嘗試運行陰影 jar 時,我不斷收到以下錯誤:

錯誤:無法找到或加載主 class com.my.package.Main

主要的 class 位於 jar 中,我知道它與最初的問題無關,但我已經求助於在 SO 和互聯網上找到的所有可能的解決方案 - 不走運。

因此,經過一番掙扎,我找到了解決問題的方法。 首先,我在lib文件夾中我想要的依賴項中添加了一個<scope/>的“provided”( 鏈接到文檔):

<dependency>
      <groupId>com.myCompany</groupId>
      <artifactId>module_to_be_excluded</artifactId>
      <version>${project.version}</version>
      <scope>provided</scope>
    </dependency>

之后,我運行了mvn clean install並檢查了輸出 .jar,但仍然在lib文件夾中找到了依賴項。 缺少的部分是在被混淆的模塊的 pom.xml 內的spring-boot-maven-plugin中添加<excludeGroupIds>com.myCompany</excludeGroupIds>

<plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
          <fork>true</fork>
          <skip>false</skip>
          <profiles>dev</profiles>
          <excludeGroupIds>com.myCompany</excludeGroupIds>
        </configuration>
        ...

將 groupId = com.myCompany 的模塊排除在外的原因是,一些正在開發的模塊也被混淆了(因此具有相同的 groupId)。 混淆某人可以輕松檢查的代碼毫無意義,同時也在lib文件夾中找到那些未混淆的 jar。

首先,我從 lib 文件夾中添加了一個“提供”(鏈接到文檔)到我想要的依賴項

這不是一個解決方案,因為默認情況下,重新打包和運行目標都將包含項目中定義的任何提供的依賴項。 Spring 引導項目應將提供的依賴項視為運行應用程序所需的容器依賴項。

https://docs.spring.io/spring-boot/docs/2.2.1.RELEASE/maven-plugin/examples/exclude-dependency.ZFC35FDC70D5FC69D2569883A82ZEC

要從 output jar 中排除庫, excludeGroupIds 按預期工作。 例如,

                    <executions>
                        <execution>
                            **<id>repackage</id>**
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                            <configuration>
                                <mainClass>...</mainClass>
                                <excludeGroupIds>com.myCompany</excludeGroupIds>
                            </configuration>
                        </execution>
                    </executions>

但是要小心,因為似乎有必要指定執行的 id,否則您要刪除的包仍將存在於 output jar 中。 這是因為插件 spring-boot-maven-plugin 執行了 2 次。 一次使用重新包裝 ID,一次使用默認 ID(其中沒有聲明的過濾器)。

[INFO] --- spring-boot-maven-plugin:2.3.1.RELEASE:repackage (repackage) @ <app name> ---
[INFO] Replacing main artifact with repackaged archive
[INFO] 
[INFO] --- spring-boot-maven-plugin:2.3.1.RELEASE:repackage (default) @ <app name> ---
[INFO] Replacing main artifact with repackaged archive

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM