确认

  • [x] 我使用的版本是最新版, 并且使用插件确认过项目里无依赖版本冲突
  • [x] 我已经在 issue 中搜索过, 确认问题没有被提出过
  • [x] 我已经修改标题, 将标题中的 描述 替换为遇到的问题

当前程序版本

Proguard + mybatis-plus 3.5.10.1 + SpringBoot 3.4.0 + openjdk 17 + MySQL 8.x + PaginationInnerInterceptor

问题描述

项目代码使用 Proguard 混淆前分页功能正常,混淆后,分页插件失效(使用的 MySQL 数据库)

不知是否是我 proguard 配置文件的问题,我已经将com.baomidou.mybatisplus.** 包下的所有类都配置为不混淆了,但是好像并没有效果

相关配置文件:

@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 防全表更新与删除插件
        interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
        // 分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加
        return interceptor;
    }
}

完整 proguard 文件

# 应用特性不能被混淆的代码
-keep @com.example.backend.common.Annotation.NotProguard class * { *; }
-keepclassmembers class * { @com.example.backend.common.Annotation.NotProguard *; }
# 保护程序入口
# -keep class com.example.backend { *; }
-keep class com.example.backend.BackendApplication { *; }
# 不混淆 ChartDataService 2024.12.15
-keep class com.example.backend.service.ChartDataService { *; }

# 不混淆 mybatis-plus 组件 (👇尝试添加这块配置,但不能解决分页插件不生效问题)
# |--> 开始
-keep class com.baomidou.mybatisplus.**
-dontnote com.baomidou.mybatisplus.**
# 保留 MyBatis-Plus 插件相关类
-keep class com.baomidou.mybatisplus.extension.plugins.** { *; }

# 保留 MyBatis-Plus 分页插件相关类
-keep class com.baomidou.mybatisplus.extension.plugins.pagination.** { *; }
# 保留 MyBatis-Plus 的 IPage 接口
-keep interface com.baomidou.mybatisplus.core.metadata.IPage { *; }
# 保留 MyBatis 插件接口
-keep class org.apache.ibatis.plugin.** { *; }

# 保留 MyBatis-Plus 分页插件相关类
-keep class com.baomidou.mybatisplus.extension.plugins.pagination.Page { *; }
-keep class com.baomidou.mybatisplus.extension.plugins.pagination.Page$* { *; }

# 保留 MyBatis-Plus 分页插件的拦截器类
-keep class com.baomidou.mybatisplus.extension.plugins.pagination.PaginationInterceptor { *; }
# |<-- 结束

# SpringBoot组件不做混淆
-keep class org.springframework.** { *; }
-dontnote org.springframework.**
-keepclassmembers class * {
  @org.springframework.** *;
  @javax.annotation.** *;
  @jakarta.annotation.** *;
}
-keep class * {
    @org.springframework.** *;
}


# 不做收缩(删除注释、未被引用代码),这个参数很关键,否则会丢掉一些源码,springboot很多组件会受影响
-dontshrink
# 不做优化(变更代码实现逻辑)
-dontoptimize
# 保持目录结构,否则spring的自动注入无法使用
-keepdirectories

# 需要保持的属性:异常,内部类,注解等
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod

# 不打印 [proguard] Note: duplicate definition of library class [module-info]
-dontnote module-info
-dontnote javax.**
-dontnote jakarta.**
-dontnote jdk.internal.**
-dontnote org.apache.commons.**

-adaptclassstrings

# 跳过非公共库的类
# -skipnonpubliclibraryclasses

# -dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers

# 混淆时不生成大小写混合的类名,默认是可以大小写混合
-dontusemixedcaseclassnames

# 允许访问并修改有修饰符的类和类的成员
-allowaccessmodification

# 对于类成员的命名的混淆采取唯一策略 (使用唯一的类名来混淆)
-useuniqueclassmembernames

# 保留包名
-keeppackagenames

# 保留Serializable序列化的类不被混淆
-keepclassmembers class * implements java.io.Serializable { *; }

-keepnames interface ** { *; }
-keep interface * extends * { *; }
-keepclassmembers enum * { *; }

# ########################################################################################################

# 不混淆所有的get/set方法
-keepclassmembers public class * {
  void set*(***);
  *** get*();
}


# Keep - Applications. Keep all application classes, along with their 'main' methods.
-keepclasseswithmembers public class * {
    public static void main(java.lang.String[]);
}

# Also keep - Enumerations. Keep the special static methods that are required in
# enumeration classes.
-keepclassmembers enum  * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

# Also keep - Database drivers. Keep all implementations of java.sql.Driver.
-keep class * extends java.sql.Driver

# Keep - Native method names. Keep all native class/method names.
-keepclasseswithmembers,includedescriptorclasses,allowshrinking class * {
    native <methods>;
}

详细堆栈日志

执行无报错,分页参数已传入,分页查询时控制台打印的 SQL 并没有拼上 LIMIT 条件

Comment From: miemieYaho

自行解决