使生成代码的自定义 Gradle 任务在 IDE 导入时运行

Posted

技术标签:

【中文标题】使生成代码的自定义 Gradle 任务在 IDE 导入时运行【英文标题】:Make custom Gradle task, that generates code, run on IDE import 【发布时间】:2019-08-17 18:43:47 【问题描述】:

由于axis2(wsdl代码生成器)没有Gradle插件,我在自定义Gradle任务中调用了Ant任务。

截至目前,./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")
    

【问题讨论】:

【参考方案1】:

您可以在 Gradle 导入或 IDE 制作之前/之后 mark any task or run configuration to be activated:

【讨论】:

谢谢,但这不是我问的:-) 我想配置构建系统。 应该告诉 IDE 要做什么。这种方式对其他用户来说更容易(如果我稍后再回到项目中,对我来说也是如此)。 看起来 youtrack.jetbrains.com/issue/IDEA-160605 是您所需要的。我会更新答案。【参考方案2】:

我现在有一个可行的解决方案。 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 任务在 IDE 导入时运行的主要内容,如果未能解决你的问题,请参考以下文章

新的自定义组件使 IDE 崩溃

Gradle:带有用于 Spring Boot 的 jvm 参数的自定义任务

Java中的APT的工作过程

Android Gradle 插件自定义 Gradle 任务 ① ( Gradle 面板显示任务列表 | 自定义任务生成与显示分组 )

Android Gradle 插件自定义 Gradle 任务 ① ( Gradle 面板显示任务列表 | 自定义任务生成与显示分组 )

在 Gradle 任务中对属性文件的内容进行排序