处理环境为您提供了一个
Filer可用于加载(已知)资源的资源。如果您需要绝对路径来发现文件或目录,则可以使用JavaFileManager和一个
StandardLocation:
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null);Iterable<? extends File> locations = fm.getLocation(StandardLocation.SOURCE_PATH);
如果使用的是Eclipse,则需要对其进行配置,以将JDK用作运行时,如注释中指出的bennyl所示。
似乎没有强制返回源位置的API,因此上述解决方案仅在某些环境下无法可靠运行。例如,仅要求Filer支持
CLASS_OUTPUT和
SOURCE_OUTPUT。
最简单的解决方法可能是假定/需要特定的项目结构,其中源目录和编译的类是在项目的特定子目录(如
src和
bin目录中大多数IDE或
src/main/java和
target/classesMaven的)。如果这样做,则可以通过
Filer在
SOURCE_OUTPUT位置创建一个临时资源来获取源路径,并从该文件的位置获取相对路径。
Filer filer = processingEnv.getFiler();FileObject resource = filer.createResource(StandardLocation.CLASS_OUTPUT, "", "tmp", (Element[]) null);Path projectPath = Paths.get(resource.toUri()).getParent().getParent();resource.delete();Path sourcePath = projectPath.resolve("src")


