Создать исходный код Java в пакете исходного кода моего проекта - PullRequest
1 голос
/ 09 октября 2019

У меня есть мой процессор аннотаций:

public class MyAnnotationProcessor extends AbstractProcessor {
    ...

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        // Here I deal with the annotated element
         ...

        // use JavaPoet to generate Java source file
        TypeSpec generatedClazz = generate_code();
        JavaFile javaFile = JavaFile.builder("com.my.foo", generatedClazz).build();
        javaFile.writeTo(filer);
    }

}

После обработки аннотированного элемента в вышеупомянутом обратном вызове process я использую JavaPoet для генерации исходного кода Java и создания файла Java длякод. При сборке моего проекта все работает, за исключением того, что сгенерированный файл исходного кода Java по умолчанию идет в build/generated/sources/myApp/com/my/foo. Как я могу сделать сгенерированный файл Java в расположении исходного кода моего проекта src/main/java/com/my/foo?

Моя сборка Gradle:

plugins {
    id 'java'
}

group 'com.my.app'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {

    testImplementation 'junit:junit:4.12'

    implementation 'com.squareup:javapoet:1.11.1'
    implementation 'com.google.guava:guava:28.1-jre'
}

1 Ответ

0 голосов
/ 11 октября 2019

Плохая новость: обработчики аннотаций не могут этого сделать - характер их циклов означает, что не будет смысла генерировать источники в том же каталоге, где живут «фактические» источники, так как эти сгенерированные источникибудет рассматриваться как входные данные при следующем запуске процессора аннотаций.

Хорошая новость: JavaPoet не зависит от того, как вы на самом деле вызываете его, поэтому вы можете просто написать простой main (), который выполняет генерацию кода, и либопопросите IDE вызывать его при сборке или прикрепите к сборке gradle. Если вы планируете вручную редактировать источники после их создания, вы, вероятно, не хотите, чтобы это происходило, поскольку вы, вероятно, намереваетесь сохранить изменения, внесенные вручную, вместо того, чтобы перезаписывать их каждый раз при сборке.

The *Метод 1005 * имеет несколько переопределений, и только один из них принимает процессор аннотаций Filer. Использование Filer имеет некоторые преимущества - очень ясно, где вы собираетесь писать класс, - но JavaFile.writeTo(File directory) также предназначен для использования таким образом. Вы не передаете ему фактический файл, где вы хотите, чтобы MyClass.java находился, а просто исходный каталог, в который вы хотите записать. В вашем случае это будет примерно javaFile.writeTo(new File("myProject/src/main/java")).

Вероятно, вам все еще следует параметризовать, как вызывать этот main, чтобы он знал, какие входы использовать, как понимать ваши существующие источники и т. Д. С другой стороныС другой стороны, если вашему generate_code() не нужны какие-либо источники из того же проекта для запуска, это должно быть довольно просто.

...