[英]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 引導項目應將提供的依賴項視為運行應用程序所需的容器依賴項。
要從 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.