【问题标题】:Configure proguard-maven-plugin to filter META-INF of a library jar配置 proguard-maven-plugin 过滤库 jar 的 META-INF
【发布时间】:2018-04-05 15:33:08
【问题描述】:

我正在尝试使用 ProGuard 来混淆我的 Java 8 jar。我无法在我的 pom.xml 文件中配置 ProGuard 插件,以便将我需要的配置发送到 ProGuard。

背景:

我的一个依赖项依赖于 Log4j 2.9.1。我在 ProGuard 中遇到了一个有据可查的错误 - https://sourceforge.net/p/proguard/bugs/665/

它建议将过滤器添加到 log4j 库以忽略 META-INF 类作为解决方法。

-libraryjars "log4j-api-2.9.0.jar"(!META-INF/versions/9/**.class)

问题:

我未能成功配置 maven 插件以将此配置发送到 ProGuard。

(注意:maven 插件会自动为 log4j 添加 -libraryjars 配置,因为它是一个项目依赖项。)

失败的尝试 #1:

我已尝试添加排除项以防止自动包含此库,并尝试添加一个库条目以将其与过滤器一起添加。

<exclusions>
  <exclude>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
  </exclude>
</exclusions>
<libs>
  <lib>${env.LOG4J_REPOSITORY}/log4j-api-2.9.1.jar(!META-INF/versions/**.class)</lib>
</libs>

排除成功,但 lib 条目失败。它被视为文件名,因此 ProGuard 的参数看起来像

-libraryjars, '/mnt/juser/repository/org/apache/logging/log4j/log4j-api/2.9.1/log4j-api-2.9.1.jar(!META-INF/versions/**.class)',

我得到了错误

 [proguard] Error: Can't read [/mnt/juser/repository/org/apache/logging/log4j/log4j-api/2.9.1/log4j-api-2.9.1.jar(!META-INF/versions/**.class)] (No such file or directory)

我尝试在 lib 声明中添加标点符号

<lib>"${env.LOG4J_REPOSITORY}/log4j-api-2.9.1.jar"(!META-INF/versions/**.class)</lib>

它为 ProGuard 创建了这个参数

-libraryjars, '"/mnt/juser/repository/org/apache/logging/log4j/log4j-api/2.9.1/log4j-api-2.9.1.jar"(!META-INF/versions/**.class)',

并因以下错误而失败

[proguard] Error: Can't read [/home/juser/working/"/mnt/juser/repository/org/apache/logging/log4j/log4j-api/2.9.1/log4j-api-2.9.1.jar"(!META-INF/versions/**.class)] (No such file or directory)

失败的尝试 #2

我已经尝试使用包含来显式添加带有过滤器的库。

<assembly>
  <inclusions>
    <inclusion>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <library>true</library>
      <filter>!META-INF/versions/**.class</filter>
    </inclusion>
  </inclusions>
</assembly>

该库被列为 -libraryjars 条目,但没有过滤器。

【问题讨论】:

    标签: java maven log4j proguard


    【解决方案1】:

    我遇到了同样的问题。以下配置对我有用:

    <plugin>
        <groupId>com.github.wvengen</groupId>
        <artifactId>proguard-maven-plugin</artifactId>
        <configuration>
            <exclusions>
                <!-- exclude the artifact -->
                <exclusion>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-api</artifactId>
                </exclusion>
            </exclusions>
        </configuration>
        <executions>
            <execution>
                <phase>package</phase>
                <goals><goal>proguard</goal></goals>
            </execution>
            <execution>
                <id>obfuscate-uber</id>
                <phase>package</phase>
                <goals><goal>proguard</goal></goals>
                <configuration>
                    <injar>${project.build.finalName}-uber.jar</injar>
                    <outjar>${project.build.finalName}-uber.jar</outjar>
                    <!-- filter out unwanted parts -->
                    <inFilter>!META-INF/versions/9/**.class</inFilter>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    【讨论】:

    • 谢谢。我认为在这种情况下,排除正在删除库,因此混淆是成功的。我认为 inFilter 标记不是必需的。 inFilter 标记将过滤器添加到 injar 而不是 libraryjars。
    • @mmdemirbas stackoverflow.com/questions/57900412/… 请看这个。谢谢你
    猜你喜欢
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 2021-08-10
    • 2012-11-21
    • 2010-12-31
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多