Как определить путь к классу аннотированного элемента в процессоре аннотаций?

У меня есть аннотация @Foo и соответствующий FooProcessor. Там мне понадобится местоположение корня проекта, которое я мог бы проанализировать с местоположением файла class / java, если бы я понял, как его получить.

Например.

  ...
   public class FooProcessor extends AbstractProcessor{
       ...
       void processElement(Element e, Foo foo){
           File f = getClassFileOrWhatever(e.getEnclosingElement());
           File projectRoot = getProjectRoot(f);
           doSomething(projectRoot);
       }
       File getClassFileOrWhatever(Element e){
           ???
       }
       ...
    }

и в другом проекте, который имеет банку с аннотацией Foo и его процессор:

/this/part/might/change/someproject/src/Foobar.java

public class Foobar{
    @Foo public void foobar(){}
}

=> Мне нужно, чтобы FooProcessor::getProjectRoot возвратил "/this/part/might/change/someproject/", что очевидно тривиально, если у меня есть "/this/part/might/change/someproject/src/Foobar.java" из FooProcessor::getClassFileOrWhatever.

Кажется, что новый File(".") Ссылается на мой домашний каталог, когда я компилирую класс с аннотированным методом с Eclipse. Я мог бы пройтись по дереву файлов оттуда и надеяться, что файл класса, обозначенный element.getEnclosingElement(), где-то там. Это, однако, кажется: а) очень медленным и б) подверженным ошибкам из-за разных сред компиляции.

1 ответ

Это сделало трюк:

 FooProcessor.class.getProtectionDomain().getCodeSource().getLocation().toString();

По сути, это дало мне путь к используемому файлу jar, который я мог бы использовать для определения корня проекта в моем случае.

Другие вопросы по тегам