Как определить путь к классу аннотированного элемента в процессоре аннотаций?
У меня есть аннотация @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, который я мог бы использовать для определения корня проекта в моем случае.