You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Hibernate生成的方法排除在Jacoco覆盖率报告之外?

排除Hibernate生成方法的Jacoco代码覆盖率

方案1:直接用Jacoco规则过滤(最省心)

Jacoco本身支持通过方法/类名的匹配规则排除特定代码,完全不用修改业务代码,直接配置就行:

  • Maven项目:在jacoco-maven-plugin的配置里加排除规则,精准匹配$$_hibernate_*开头的方法:
<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.10</version>
    <configuration>
        <excludes>
            <exclude>**/*$$_hibernate_*</exclude>
        </excludes>
    </configuration>
</plugin>
  • Gradle项目:在jacocoTestReport任务里配置类目录的排除规则:
jacocoTestReport {
    afterEvaluate {
        classDirectories.setFrom(files(classDirectories.files.collect {
            fileTree(dir: it, exclude: ['**/*$$_hibernate_*'])
        }))
    }
}

这种方式直接通过命名规则过滤,不需要依赖任何Hibernate生成器,上手快还靠谱。

方案2:通过字节码增强给生成方法加@Generated注解

如果你一定要用注解的方式让Jacoco排除,Hibernate Metamodel Generator本身不会自动给$$_hibernate_*这类代理方法加注解,但可以结合字节码工具实现:

  1. 先确保引入Hibernate Metamodel Generator依赖(Maven示例):
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-jpamodelgen</artifactId>
    <version>6.4.4.Final</version>
    <scope>provided</scope>
</dependency>
  1. 使用Byte Buddy、ASM这类字节码操作库,在编译阶段对Hibernate生成的代理类做增强,给所有以$$_hibernate_开头的方法加上javax.annotation.Generated或者jakarta.annotation.Generated注解(Jacoco会自动忽略带这个注解的方法)。
  2. 也可以扩展Hibernate的EnhancementContext接口,自定义代理类生成时的逻辑,自动注入注解。不过这种方式需要写自定义扩展,复杂度高,远不如方案1省事。

总结

首推方案1,用Jacoco自带的过滤规则解决,成本低效果稳。只有在必须通过注解排除的场景下,再考虑方案2的字节码增强方案——Hibernate Metamodel Generator本身不直接提供这个功能,但可以作为基础配合字节码工具实现。

内容的提问来源于stack exchange,提问作者dhalsim2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:42:35