繁体   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