【问题标题】:Exclude obfuscated jar from lib folder with ProGuard使用 ProGuard 从 lib 文件夹中排除混淆的 jar
【发布时间】:2020-02-10 08:51:00
【问题描述】:

我在我的多模块 maven 项目中使用了 proguard-maven-plugin 和 spring boot。绝不,我不是专家,还在学习如何使用 ProGuard 提供的所有功能,所以请多多包涵。 ProGuard 依赖:

<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.1.1</version>

最终产品是一个 .jar 文件,它依赖于具有核心功能的成功混淆模块。使用maven编译打包product jar后,其结构如下(使用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 创建一个 uber JAR 来绕过生成一个具有依赖项的单独文件夹。使用时,它将所有依赖项添加到类路径中,然后使用 ProGuard 插件来混淆需要混淆的内容。项目结构看起来令人满意,依赖项添加到类路径并正确混淆。但是当我尝试运行阴影 jar 时,我不断收到以下错误:

错误:无法找到或加载主类 com.my.package.Main

在 jar 中找到 Main 类,我知道它与最初的问题无关,但我已经求助于在 SO 和互联网上找到的所有可能的解决方案 - 不走运。

【问题讨论】:

    标签: java spring-boot proguard-maven-plugin


    【解决方案1】:

    所以,经过一番挣扎,我找到了解决问题的方法。首先,我在 lib 文件夹中我想要的依赖项中添加了一个 &lt;scope/&gt; 的“提供”(link to docs):

    <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 中添加 &lt;excludeGroupIds&gt;com.myCompany&lt;/excludeGroupIds&gt;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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      相关资源
      最近更新 更多