创建自定义 Gradle 任务,生成代码,运行 on IDE import
Make custom Gradle task, that generates code, run on IDE import
由于没有 Gradle axis2 插件(wsdl 代码生成器),我在自定义 Gradle 任务中调用了 Ant 任务。
现在 ./gradlew build
生成代码,./gradlew clean
删除它。此外,仅当检测到输入文件或输出目录发生更改时,才会生成代码。
我遇到的唯一问题是,当项目导入到 IDE.
时,代码不会自动生成。
我需要如何更改下面的 build.gradle.kts
才能让 IDEs(目前是 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")
}
}
您可以 mark any task or run configuration to be activated before/after Gradle 导入或 IDE 制作:
我现在有一个可行的解决方案。 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")
}
}
但这是一个不同的问题。
更新
下面的代码块告诉 Eclipse 包含生成的源代码
eclipse {
classpath {
plusConfigurations.add(configurations.findByName("compile"))
}
}
这告诉 IntelliJ 将生成的和已经包含的源标记为已生成
idea {
module {
generatedSourceDirs.add(file("generated/src/main/java"))
}
}
由于没有 Gradle axis2 插件(wsdl 代码生成器),我在自定义 Gradle 任务中调用了 Ant 任务。
现在 ./gradlew build
生成代码,./gradlew clean
删除它。此外,仅当检测到输入文件或输出目录发生更改时,才会生成代码。
我遇到的唯一问题是,当项目导入到 IDE.
时,代码不会自动生成。我需要如何更改下面的 build.gradle.kts
才能让 IDEs(目前是 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")
}
}
您可以 mark any task or run configuration to be activated before/after Gradle 导入或 IDE 制作:
我现在有一个可行的解决方案。 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")
}
}
但这是一个不同的问题。
更新
下面的代码块告诉 Eclipse 包含生成的源代码
eclipse {
classpath {
plusConfigurations.add(configurations.findByName("compile"))
}
}
这告诉 IntelliJ 将生成的和已经包含的源标记为已生成
idea {
module {
generatedSourceDirs.add(file("generated/src/main/java"))
}
}