[英]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.