2014-03-19 40 views
2

我正在構建一個用於eclipse的註釋處理器插件, 我想要做的是在處理過程中檢查項目文件夾中的幾個文件。Eclipse - 註釋處理器,獲取項目路徑

我想知道如何從我的處理器中獲取項目路徑。 我相信可以這樣做,因爲項目源路徑提供給處理器 - 但我找不到達到它的方法。

我試圖尋找在System.properties並在processingEnv.getOptions(),但沒有有用的信息有..

最終我想這樣如果有一個使用NetBeans上此註釋處理器太公共API可以提供此信息它將是最好的 - 但任何幫助將不勝感激。

回答

0

處理環境爲您提供了一個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_OUTPUTSOURCE_OUTPUT

最簡單的解決方法可能是假定/需要一個特定的項目結構,其中編譯的類位於項目的直接子目錄中(對於大多數IDE bin或Mavens target目錄,這是默認設置)。如果你這樣做,那麼你可以使用位於SOURCE_OUTPUT位置的Filer創建一個臨時資源文件,並從該文件獲取路徑。

Filer filer = processingEnv.getFiler(); 
FileObject resource = filer.createResource(StandardLocation.CLASS_OUTPUT, "", "tmp", (Element[]) null); 
Path projectPath = Paths.get(resource.toUri()).getParent().getParent(); 
resource.delete(); 
+0

這並不eclipse下對我的工作 - 從日食執行時ToolProvider.getSystemJavaCompiler()返回NULL(我認爲該eclipse使用自己的編譯器,不尊重這個API) – bennyl

+1

終於找到了一個解決方案 - 空編譯器問題可以通過遵循這個線程的指示來解決:http://stackoverflow.com/questions/9107099/null-javacompiler-in -eclipse - 謝謝你! – bennyl

+0

對我來說這仍然不起作用。 'fm.getLocation(StandardLocation.SOURCE_PATH)'返回null ..我在'AbstractProcessor'的擴展中的init方法中調用了這個函數。任何提示? – jurgenv

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 ""; 
}