如何使用注解处理器生成的类?编译提示包不存在
解决注解处理器生成文件后包不存在的问题
核心问题
你生成的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; } }
关键修正点
- 使用
Filer.createSourceFile():该方法会根据类的全限定名(foo.bar.MyPojo)自动创建foo/bar子目录,并将MyPojo.java放在其中,完全符合Java的包结构要求。 - 使用try-with-resources:自动关闭流,避免资源泄漏,代码更简洁可靠。
- 添加
@SupportedSourceVersion:明确注解处理器支持的JDK版本,避免编译警告。
验证步骤
- 重新执行构建(比如
./gradlew build)。 - 检查生成文件路径:确认
MyPojo.java出现在lib/build/generated/sources/annotationProcessor/java/main/foo/bar/下。 - 运行
Main类:此时编译器能正确识别foo.bar.MyPojo包,不会再报“包不存在”的错误。
Gradle依赖注意事项
确保在lib模块的build.gradle.kts中正确引入注解处理器依赖:
dependencies { annotationProcessor(project(":processor")) compileOnly(project(":processor")) // 让主代码能识别MyAnnotation注解 }
内容的提问来源于stack exchange,提问作者I was in the neighborhood
相关产品推荐
相关产品推荐

