我正在为eclipse构建一个注释处理器插件, 我想做的是在处理过程中检查项目文件夹中的几个文件。
我想知道如何从我的处理器中获取项目路径。 我相信这可以做到,因为项目源路径是提供给处理器的 - 但我找不到达到它的方法。
我尝试查看System.properties和processingEnv.getOptions(),但那里没有有用的信息..
最终我想在Netbeans上使用这个注释处理器,所以如果有一个公共API可以提供这些信息它将是最好的 - 但任何帮助将不胜感激..
答案 0 :(得分:2)
处理环境为您提供了Filer
,可用于加载(已知)资源。如果需要绝对路径来发现文件或目录,可以使用JavaFileManager和StandardLocation
:
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null);
Iterable<? extends File> locations = fm.getLocation(StandardLocation.SOURCE_PATH);
如果您使用的是Eclipse,则需要configure it to use the JDK as runtime作为bennyl在评论中指出。
似乎没有API有义务返回源位置,因此上面的解决方案不会可靠地工作,只能在某些环境中工作。例如,Filer仅需要支持CLASS_OUTPUT
和SOURCE_OUTPUT
。
最简单的解决方法可能是假设/需要特定的项目结构,其中源目录和编译的类位于项目的特定子目录中(例如,大多数IDE的src
和bin
目录或Maven的src/main/java
和target/classes
。如果这样做,您可以通过在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")
答案 1 :(得分:1)
我通过生成源文件来获取ProsessingEnv
的源路径:
String fetchSourcePath() {
try {
JavaFileObject generationForPath = processingEnv.getFiler().createSourceFile("PathFor" + getClass().getSimpleName());
Writer writer = generationForPath.openWriter();
String sourcePath = generationForPath.toUri().getPath();
writer.close();
generationForPath.delete();
return sourcePath;
} catch (IOException e) {
processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING, "Unable to determine source file path!");
}
return "";
}