Создайте пользовательскую задачу Gradle, генерирующую код, запускаемую при импорте IDE - PullRequest
0 голосов
/ 27 марта 2019

Поскольку отсутствует плагин Gradle для axis2 (генератор кода wsdl), я вызвал задачу Ant в пользовательской задаче Gradle.

На данный момент ./gradlew build генерирует код, а ./gradlew clean удаляет его. Кроме того, код генерируется только в случае обнаружения изменений во входном файле (ах) или в выходном каталоге.

Единственная проблема, с которой я сталкиваюсь, заключается в том, что код не генерируется автоматически при импорте проекта в IDE.

Как мне нужно изменить build.gradle.kts ниже, чтобы IDE (в настоящее время IntelliJ, но я также хотел бы иметь поддержку Eclipse) генерировали код при импорте?


plugins {
    id("base") // needed for delete
}

val axis2 by configurations.creating

dependencies {
    axis2("org.apache.axis2:axis2-ant-plugin:$axis2Version")
    axis2("org.apache.axis2:axis2-xmlbeans:$axis2Version")
}


val wsdl2Java by tasks.registering {
    group = "build"
    description = "Creates Java classes and resources from WSDL schema."

    inputs.files(fileTree("$projectDir/src/main/resources/wsdl"))
    outputs.dir("$projectDir/generated/")

    doLast {
        ant.withGroovyBuilder {
            "echo"("message" to "Generating Classes from WSDL!")
            "taskdef"("name" to "codegen", "classname" to "org.apache.axis2.tool.ant.AntCodegenTask", "classpath" to axis2.asPath)
            "codegen"(
                    "wsdlfilename" to "$projectDir/src/main/resources/wsdl/MP12N-H-HOST-WEB-SOAP.wsdl",
                    "output" to "$projectDir/generated/",
                    "targetSourceFolderLocation" to "src/main/java",
                    "targetResourcesFolderLocation" to "src/main/resources",
                    "packageName" to "de.hanel.com.jws.main",
                    "databindingName" to "xmlbeans")
        }
    }
}


val deleteGenerated by tasks.registering(Delete::class) {
    delete("$projectDir/generated/")
}

tasks {
    compileJava {
        dependsOn(wsdl2Java)
    }

    clean {
        dependsOn(deleteGenerated)
    }
}

java {
    sourceSets["main"].java {
        srcDir("generated/src/main/java")
    }

    sourceSets["main"].resources {
        srcDir("generated/src/main/resources")
    }
}

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Вы можете пометить любую задачу или запустить конфигурацию для активации до / после импорта Gradle или создания IDE:

enter image description here

0 голосов
/ 27 марта 2019

У меня есть рабочее решение сейчас. И Eclipse, и IntelliJ генерируют исходный код при импорте.

Сначала мы добавим специфичные для IDE плагины.

apply {
    plugin("idea")
    plugin("eclipse")
}

Затем мы получаем соответствующие задачи IDE и добавляем нашу собственную задачу, которая была определена в val wsdl2Java, как зависимость

// find by name (in tasks container), since a module is also called 'idea'
project.tasks.findByName("idea")?.dependsOn(wsdl2Java)
project.tasks.findByName("eclipse")?.dependsOn(wsdl2Java)

Единственная проблема в том, что Eclipse, очевидно, не может справиться

java {
    sourceSets["main"].java {
        srcDir("generated/src/main/java")
    }

    sourceSets["main"].resources {
        srcDir("generated/src/main/resources")
    }
}

Но это другой вопрос.

UPDATE

Блок кода ниже указывает Eclipse включить сгенерированные источники

eclipse {
    classpath {
        plusConfigurations.add(configurations.findByName("compile"))
    }
}

и это говорит IntelliJ пометить сгенерированные и уже включенные источники как сгенерированные

idea {
    module {
        generatedSourceDirs.add(file("generated/src/main/java"))
    }
}
...