qq_44051339 2023-09-22 10:56 采纳率: 0%
浏览 203

proguard-maven-plugin 2.6.0插件使用出现的问题

环境jdk17+springboot3.0.8+proguard-maven-plugin 2.6.0

项目可以正常打包,也可以执行混淆,现在出现的问题就是,在项目文件发生更改时,再次进行maven package 打包时,最终生成的已被混淆的jar包不是最新的项目文件,但是生成的其他额外的jar包里面时最新的,但是那些都不是可以启动的jar
如下图

img

1是最终生成可执行的jar,里面的classes文件时混淆后的,但是跟3是不一致的

img

2是原始的jar,里面包含原始的classes 文件

img

3是混淆后的classes文件

img

现在这个找不到什么原因,但是我第二天再进行maven package 时就会将最新的项目文件混淆加入jar包

最后附上我的pom文件关于proguard的部分信息

<!--代码混淆 -->
<plugin>
    <groupId>com.github.wvengen</groupId>
    <artifactId>proguard-maven-plugin</artifactId>
    <version>2.6.0</version>
    <executions>
        <!-- 以下配置说明执行mvn的package命令时候,会执行proguard-->
        <execution>
            <id>proguard</id>
            <phase>package</phase>
            <goals>
                <goal>proguard</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <proguardVersion>7.2.2</proguardVersion>
        <attachArtifactClassifier>proguard</attachArtifactClassifier>
        <!--就是输入Jar的名称,我们要知道,代码混淆其实是将一个原始的jar,生成一个混淆后的jar,那么就会有输入输出 -->
        <injar>${project.build.finalName}.jar</injar>
        <!--是否混淆-->
        <obfuscate>true</obfuscate>
        <!-- 配置一个文件,通常叫做proguard.cfg,该文件主要是配置options选项,也就是说使用proguard.cfg那么options下的所有内容都可以移到proguard.cfg中-->
        <!--<proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>-->
        <!-- 对输入jar进行过滤比如,如下配置就是对META-INFO文件不处理-->
        <!--<inLibsFilter>!META-INF/**</inLibsFilter>-->
        <!-- 这里特别重要,此处主要是配置混淆的一些细节选项,比如哪些类不需要混淆,哪些需要混淆-->
        <options>
            <!-- #proguard 会对代码进行优化压缩,他会删除从未使用的类或者类成员变量-->
            <option>-dontshrink</option>
            <!-- #是否关闭字节码级别的优化,如果不开启则设置如下配置-->
            <option>-dontoptimize</option>
            <!-- #混淆时不生成大小写混合的类名,默认是可以大小写混合-->
            <option>-dontusemixedcaseclassnames</option>
            <!-- 保持目录结构,否则spring的自动注入无法使用-->
            <option>-keepdirectories</option>
            <!-- 对于类成员的命名的混淆采取唯一策略-->
            <option>-useuniqueclassmembernames</option>
            <!-- 混淆类名之后,对使用Class.forName('className')之类的地方进行相应的替代-->
            <option>-adaptclassstrings</option>
            <!-- 对异常、注解信息予以保留-->
            <option>-keepattributes
                Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
            </option>
            <!-- 此选项将保存接口中的所有原始名称(不进行混淆)-->
            <option>-keepnames interface * { *; }</option>
            <!-- 此选项将保存所有软件包中的所有原始接口文件(不进行混淆)-->
            <option>-keep interface * extends * { *; }</option>
            <!-- 不混淆controller包路径-->
            <option>-keeppackagenames com.geega.app.web.controller</option>
            <!-- 不混淆controller类的public方法-->
            <option>-keepclassmembers class com.geega.app.web.controller.* {
                public *** *(...);
                }
            </option>
            <!-- 保留req包下的实体类不被混淆-->
            <option>-keep public class com.geega.app.web.req.** { *; }</option>
            <!--<option>-keepclassmembers class com.geega.app.web.req.ToAudioReq {
                public void setVolume(java.lang.Integer);
                public void setRate(java.lang.Integer);
                public void setText(java.lang.String);
                }</option>-->
            <!-- 保留参数名,因为控制器,或者Mybatis等接口的参数如果混淆会导致无法接收参数,xml文件找不到参数-->
            <option>-keepparameternames</option>
            <!-- 保留枚举成员及方法-->
            <option>-keepclassmembers enum * { *; }</option>
            <!-- #被注解@NotProGuard标记的不能被混淆 #不混淆所有类,保存原始定义的注释-->
            <option>-keepclassmembers class * {
                @org.springframework.context.annotation.Bean *;
                @org.springframework.beans.factory.annotation.Autowired *;
                @org.springframework.beans.factory.annotation.Value *;
                @org.springframework.stereotype.Service *;
                @org.springframework.stereotype.Component *;
                @com.geega.app.web.common.annotation.NotProguard *;
                }
            </option>
            <!-- 保留Serializable序列化的类不被混淆-->
            <option>-keepclassmembers class * implements java.io.Serializable { *; }</option>
            <!-- 忽略warn消息-->
            <option>-ignorewarnings</option>
            <!-- 忽略note消息-->
            <option>-dontnote</option>
            <!-- 打印配置信息-->
            <option>-printconfiguration</option>

            <option>-keep public class com.geega.app.MyApplication { *; }</option>
        </options>


        <!--输出jar名称,输入输出jar同名的时候就是覆盖,也就是比较常用的配置-->
        <outjar>${project.build.finalName}.jar</outjar>
        <!-- 这是输出路径配置,但是要注意这个路径必须要包括injar标签填写的jar-->
        <outputDirectory>${project.basedir}/target</outputDirectory>
    </configuration>
    <dependencies>
        <!--<dependency>
            <groupId>com.guardsquare</groupId>
            <artifactId>proguard-base</artifactId>
            <version>7.2.2</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.guardsquare</groupId>
            <artifactId>proguard-core</artifactId>
            <version>9.0.1</version>
        </dependency>-->
    </dependencies>

</plugin>

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-09-22 12:38
    关注

    【相关推荐】



    • 这篇博客: 基于Maven的SpringBoot工程中,如何使用proguard进行Java代码混淆?中的 (3)打包之后不知道混淆成功了没,或者混淆配置生效了没,查看这个jar包里的代码又很麻烦 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

      解决方式:outjar配置一个目录即可。如果要上传私服,打包之后却有两个包,混淆的那个包无法直接上传私服,那么outjar配置的jar包名称和${project.build.finalName}一致,即可覆盖。然后一键轻松上传私服。

      <!--class 混淆后输出的jar包 或 文件夹-->
      <outjar>${project.build.finalName}.jar</outjar>
      
      

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 9月22日