使用 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 文件,它依赖于具有核心功能的成功混淆模块。 product jar用maven编译打包后结构如下(使用jd-gui-1.6.6查看product 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 examples,还没找到方法。是否可以排除或至少混淆 /lib
中的核心 .jar 模块?
编辑:我试图通过使用 maven-shade-plugin 创建一个超级 JAR 来绕过生成具有依赖项的单独文件夹。使用时,它将所有依赖项添加到 class 路径,然后使用 ProGuard 插件混淆需要混淆的内容。项目的结构看起来令人满意,依赖项添加到 classpath 并正确混淆。但是当我尝试 运行 阴影罐时,我不断收到以下错误:
Error: Could not find or load main class com.my.package.Main
主要 class 在罐子中找到,我知道它与最初的问题无关,但我已经求助于在 SO 和互联网上找到的所有可能的解决方案 - 运气不好。
所以,经过一番努力,我找到了解决问题的方法。首先,我从 lib
文件夹中添加了 "provided" (link to docs) 的 <scope/>
到我想要的依赖项:
<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 中添加 <excludeGroupIds>com.myCompany</excludeGroupIds>
in spring-boot-maven-plugin
:
<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。
我在我的多模块 Maven 项目中使用 proguard-maven-plugin spring 启动。绝不是,我不是专家并且仍在学习如何使用 ProGuard 提供的所有功能,所以请耐心等待。 ProGuard 依赖项:
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.1.1</version>
最终产品是一个 .jar 文件,它依赖于具有核心功能的成功混淆模块。 product jar用maven编译打包后结构如下(使用jd-gui-1.6.6查看product 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 examples,还没找到方法。是否可以排除或至少混淆 /lib
中的核心 .jar 模块?
编辑:我试图通过使用 maven-shade-plugin 创建一个超级 JAR 来绕过生成具有依赖项的单独文件夹。使用时,它将所有依赖项添加到 class 路径,然后使用 ProGuard 插件混淆需要混淆的内容。项目的结构看起来令人满意,依赖项添加到 classpath 并正确混淆。但是当我尝试 运行 阴影罐时,我不断收到以下错误:
Error: Could not find or load main class com.my.package.Main
主要 class 在罐子中找到,我知道它与最初的问题无关,但我已经求助于在 SO 和互联网上找到的所有可能的解决方案 - 运气不好。
所以,经过一番努力,我找到了解决问题的方法。首先,我从 lib
文件夹中添加了 "provided" (link to docs) 的 <scope/>
到我想要的依赖项:
<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 中添加 <excludeGroupIds>com.myCompany</excludeGroupIds>
in spring-boot-maven-plugin
:
<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。