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

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

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

3是混淆后的classes文件

现在这个找不到什么原因,但是我第二天再进行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>