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

如何使用注解处理器生成的类?编译提示包不存在

解决注解处理器生成文件后包不存在的问题

核心问题

你生成的MyPojo.java文件没有放在与包名匹配的目录结构中。你的类声明了package foo.bar;,但文件直接放在了build/generated/sources/annotationProcessor/java/main/根目录下,而非main/foo/bar/子目录里。Java编译器要求类文件的存储路径必须与包名严格对应,否则无法识别包结构。

另外,你手动添加源码集的操作其实多余——Gradle默认已经将annotationProcessor生成目录纳入了主源码集的编译路径,无需额外配置。

修正注解处理器代码

不要手动通过FileOutputStream写文件,改用注解处理器API提供的Filer.createSourceFile()方法,它会自动根据全类名创建对应的包目录结构:

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Filer;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.TypeElement;
import javax.tools.JavaFileObject;
import java.io.BufferedWriter;
import java.io.IOException;
import java.util.Set;

@SupportedAnnotationTypes("deoplice.processor.MyAnnotation")
@SupportedSourceVersion(SourceVersion.RELEASE_17) // 根据你的JDK版本调整
public class MySimpleProcessor extends AbstractProcessor {

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        // 生成类的全限定名
        String fullyQualifiedName = "foo.bar.MyPojo";
        String src = "package foo.bar;\n\n" +
                "public class MyPojo {\n" +
                "\tpublic MyPojo() {}\n" +
                "}";

        // 获取Filer实例,用于创建源文件
        Filer filer = processingEnv.getFiler();
        try {
            // 自动创建包目录并生成源文件
            JavaFileObject sourceFile = filer.createSourceFile(fullyQualifiedName);
            try (BufferedWriter writer = new BufferedWriter(sourceFile.openWriter())) {
                writer.write(src);
            }
        } catch (IOException e) {
            throw new RuntimeException("Failed to generate source file", e);
        }

        return true;
    }
}

关键修正点

  1. 使用Filer.createSourceFile():该方法会根据类的全限定名(foo.bar.MyPojo)自动创建foo/bar子目录,并将MyPojo.java放在其中,完全符合Java的包结构要求。
  2. 使用try-with-resources:自动关闭流,避免资源泄漏,代码更简洁可靠。
  3. 添加@SupportedSourceVersion:明确注解处理器支持的JDK版本,避免编译警告。

验证步骤

  1. 重新执行构建(比如./gradlew build)。
  2. 检查生成文件路径:确认MyPojo.java出现在lib/build/generated/sources/annotationProcessor/java/main/foo/bar/下。
  3. 运行Main类:此时编译器能正确识别foo.bar.MyPojo包,不会再报“包不存在”的错误。

Gradle依赖注意事项

确保在lib模块的build.gradle.kts中正确引入注解处理器依赖:

dependencies {
    annotationProcessor(project(":processor"))
    compileOnly(project(":processor")) // 让主代码能识别MyAnnotation注解
}

内容的提问来源于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:50:23