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

Gradle测试包注解处理器生成文件无法引用问题求助

注解处理器生成的test目录文件在测试编译时无法被识别

问题背景

我开发了一个能生成Java源文件的注解处理器,生成文件会写入Gradle 7.4.2的标准目录:

  • 为main包带注解类生成的文件存放在build/generated/sources/annotationProcessor/java/main
  • 为test包带注解类生成的文件存放在build/generated/sources/annotationProcessor/java/test

当前核心问题:编译测试代码时,能正常引用main目录下的生成文件,但一旦引用test目录下的生成文件,就会触发cannot find symbol编译错误。

环境与目录结构

使用Gradle 7.4.2初始化的标准多项目结构:

├── lib                           # 使用注解的业务模块
│   └── src/main/com/myproject
│         └── MyPojo.java         # 带注解的main业务类
│   └── src/test/com/myproject
│         └── MyOtherPojo.java    # 带注解的test类
│         └── MyTest.java         # 测试代码编写位置
│   └── build.gradle.kts
├── processor                     # 注解处理器实现模块
│   └── build.gradle.kts
└── settings.gradle.kts

当前lib模块build.gradle配置

已手动添加生成目录到源集,配置如下:

plugins {
    id("java")
}

group = "myproject"
version = "0.1"

repositories {
    mavenCentral()
}

dependencies {
    testImplementation("org.junit.jupiter:junit-jupiter:5.8.1")

    compileOnly("org.projectlombok:lombok:1.18.24")
    annotationProcessor("org.projectlombok:lombok:1.18.24")

    testCompileOnly("org.projectlombok:lombok:1.18.24")
    testAnnotationProcessor("org.projectlombok:lombok:1.18.24")

    // 自定义注解处理器依赖
    implementation(project(":processor"))
    annotationProcessor(project(":processor"))
    testAnnotationProcessor(project(":processor"))
}

sourceSets {
    main {
        java {
            srcDir("path\\to\\lib\\build\\generated\\sources\\annotationProcessor\\java\\main")
        }
    }
    test {
        java {
            srcDir("path\\to\\lib\\build\\generated\\sources\\annotationProcessor\\java")
        }
    }
}

tasks.named<Test>("test") {
    useJUnitPlatform()
}

现象与错误详情

  • 注解处理器能正常识别main和test包中的带注解类,分别生成MyPojoHelper.java和MyOtherPojoHelper.java到对应目录
  • 测试代码引用main目录生成类正常工作:
    @Test
    public void myTest() {
        generated.myproject.MyPojoHelper.someMethod("foo"); // 无编译错误,可正常运行
    }
    
  • 引用test目录生成类则编译失败:
    @Test
    public void myTest() {
        generated.myproject.MyOtherPojoHelper.someMethod("foo"); // 编译报错
    }
    
  • 具体错误信息:
    error: package gen.myproj does not exist
            gen.myproj.MyOtherPojoHelper.someMethood("foo");
                      ^
    

已尝试的无效方案

显式将test生成目录添加到test源集,问题未解决:

sourceSets {
    main {
        java {
            srcDir("path\\to\\lib\\build\\generated\\sources\\annotationProcessor\\java\\main")
        }
    }
    test {
        java {
            srcDir("path\\to\\lib\\build\\generated\\sources\\annotationProcessor\\java")
        }
    }
    test {
        java {
            srcDir("path\\to\\lib\\build\\generated\\sources\\annotationProcessor\\java\\test")
        }
    }
}

解决方案

1. 修正源集路径配置(核心修复)

不要使用硬编码绝对路径,改用Gradle内置的任务属性自动引用生成目录,避免路径匹配错误:

sourceSets {
    main {
        java {
            // 自动指向main包注解处理器生成目录
            srcDir(tasks.compileJava.get().options.generatedSourcesDir)
        }
    }
    test {
        java {
            // 自动指向test包注解处理器生成目录
            srcDir(tasks.compileTestJava.get().options.generatedSourcesDir)
        }
    }
}

Gradle的compileJava任务的generatedSourcesDir默认对应build/generated/sources/annotationProcessor/java/main,compileTestJava则对应build/generated/sources/annotationProcessor/java/test,能确保路径完全匹配。

2. 校验生成类的包名与目录结构

检查MyOtherPojoHelper.java的包名是否与测试代码中的引用一致:

  • 错误信息中显示的是gen.myproj,但测试代码引用的是generated.myproject,大概率是注解处理器生成时包名写错
  • 同时确认生成文件的目录结构是否与包名对应(比如生成类包名是generated.myproject,则文件应放在test/generated/myproject下,而非直接在test根目录)

3. 清理缓存后重新构建

缓存可能导致生成文件未被正确识别,执行以下命令清理后重新构建:

./gradlew clean build test

内容的提问来源于stack exchange,提问作者I was in the neighborhood

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:40:27