2014-10-03 3 views
1

Im пишущий обработчик аннотации для проектов android. Я хочу получить абсолютный путь к папке ресурсов андроидов (я знаю, что он настраивается с помощью градиента, но я сейчас игнорирую этот случай).Получить путь к файлу рабочего каталога

Моя идея заключается в том, чтобы получить полный путь к обрабатываемой элемента:

@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(); 

Если вы знаете, тх t выходной каталог, например, находится в your_project/target/classes, вы можете использовать его в каталоге источника или ресурса.