使用 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。