2014-10-03 82 views
1

我正在爲android項目編寫註釋處理器。我想獲取androids資源文件夾的絕對路徑(我知道它可以通過gradle配置,但我現在忽略這種情況)。獲取工作目錄的文件路徑

我的想法是得到一個處理元素的絕對路徑:

@MyAnnotation public class Foo{ ... } 

所以在我AnnotationProcessor我想要去Foo.java的路徑。

@Override public boolean process(Set<? extends TypeElement> annotations, 
     RoundEnvironment roundEnv) { 

    for (Element element : roundEnv.getElementsAnnotatedWith(MyAnnotation.class)) 

     try { 
     ProcessorMessage.info(element, "Path: %s %s", getWorkingDir(), getExecutionPath()); 
     } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
     ProcessorMessage.error(element, "Error " + e.getMessage()); 
     } 

    return false; 
    } 

    private String getExecutionPath() throws UnsupportedEncodingException { 
    String path = AnnotatedAdapterProcessor.class.getProtectionDomain() 
     .getCodeSource() 
     .getLocation() 
     .getPath(); 
    String decodedPath = URLDecoder.decode(path, "UTF-8"); 

    return decodedPath; 
    } 

    private String getWorkingDir() { 
    Path currentRelativePath = Paths.get(""); 
    String s = currentRelativePath.toAbsolutePath().toString(); 
    return s; 
    } 

但是它給了我下面的輸出:

路徑:/Users/XXXXX/.gradle/daemon/1.12 /Users/XXXXX/.m2/repository/com/example/myprocessor/processor/ 0.1.2-SNAPSHOT/processor-0.1.2-SNAPSHOT.jar

有沒有辦法獲得Foo.java所在的路徑? (只是爲了從我會繼續開始搜索資源文件夾的起點)

回答

0

我認爲這些路徑可能取決於您的構建環境,如果您手動構建它們,可能它們不會在每個機器或每個IDE。
這個問題可能會有所幫助:Annotation processor, get project path

如果不工作,我想你還是在正確的軌道上存在,但應儘量使用實際的資源,而不是通過對處理器加載的類,像這樣:

String path = Foo.class.getProtectionDomain().getCodeSource().getLocation().getPath(); 

我不知道這一切是否也適用於處理器的情況下,但總體上這應該給你的類文件的根輸出目錄:

String path = Foo.class.getClassLoader().getResource(".").getFile(); 

如果你知道塔例如輸出目錄在your_project/target/classes中,可以使用該目錄進入源或資源目錄。