You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写Gradle插件映射Maven Mojo输入输出?求示例代码

实现Gradle自定义任务映射QuickFIX-J代码生成Mojo

1. 先分析Mojo核心参数

首先明确目标Mojo(org.quickfixj.codegenerator.CodeGeneratorMojo)的核心配置项,这些需要映射为Gradle任务的输入/输出:

  • 输入:FIX协议spec文件(specFile)、模板目录(templateDirectory)
  • 输出:代码生成目标目录(targetDirectory)
  • 配置参数:根包名(packageName)、消息子包名(messagePackage)、是否生成JavaBean风格方法(useJavaBeans)

2. 编写自定义Gradle任务类型

在项目的buildSrc模块中创建任务类,直接复用QuickFIX-J的核心代码生成逻辑(避免依赖Maven API):

import org.gradle.api.DefaultTask
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.provider.Property
import org.gradle.api.tasks.*
import org.quickfixj.codegenerator.CodeGenerator
import org.quickfixj.codegenerator.GeneratorSettings

abstract class QuickfixjCodeGeneratorTask extends DefaultTask {

    // 对应Mojo的specFile参数,标记为输入文件
    @InputFile
    @PathSensitive(PathSensitivity.NAME_ONLY)
    abstract RegularFileProperty getSpecFile()

    // 对应Mojo的targetDirectory,标记为输出目录(Gradle自动做增量构建)
    @OutputDirectory
    abstract DirectoryProperty getTargetDirectory()

    // 对应Mojo的templateDirectory,标记为输入目录
    @InputDirectory
    @PathSensitive(PathSensitivity.RELATIVE)
    abstract DirectoryProperty getTemplateDirectory()

    // 根包名配置
    @Input
    abstract Property<String> getPackageName()

    // 消息子包名配置
    @Input
    abstract Property<String> getMessagePackage()

    // 是否生成JavaBean风格的getter/setter
    @Input
    abstract Property<Boolean> getUseJavaBeans()

    @TaskAction
    void generate() {
        // 构建生成器配置,和Mojo内逻辑一致
        GeneratorSettings settings = new GeneratorSettings()
        settings.setSpecFile(specFile.get().asFile)
        settings.setTargetDirectory(targetDirectory.get().asFile)
        settings.setTemplateDirectory(templateDirectory.get().asFile)
        settings.setPackageName(packageName.get())
        settings.setMessagePackage(messagePackage.get())
        settings.setUseJavaBeans(useJavaBeans.get())

        // 执行代码生成
        new CodeGenerator(settings).generate()
    }
}

3. 封装为可复用Gradle插件(可选)

如果需要在多个项目中复用,在buildSrc中编写插件类:

import org.gradle.api.Plugin
import org.gradle.api.Project

class QuickfixjCodeGeneratorPlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        // 注册任务到项目
        project.tasks.register('generateQuickfixj', QuickfixjCodeGeneratorTask) { task ->
            // 设置默认模板目录(可根据需求调整)
            task.templateDirectory.set(project.layout.projectDirectory.dir('src/main/resources/templates'))
            // 默认启用JavaBean风格
            task.useJavaBeans.set(true)
        }
    }
}

然后在buildSrc/src/main/resources/META-INF/gradle-plugins下创建插件标识文件(比如com.yourorg.quickfixj-codegen.properties):

implementation-class=com.yourorg.QuickfixjCodeGeneratorPlugin

4. 在业务项目中使用

在项目的build.gradle中配置任务:

plugins {
    id 'java'
    // 如果用了自定义插件,引入它
    id 'com.yourorg.quickfixj-codegen'
}

dependencies {
    // 引入QuickFIX-J代码生成器依赖
    implementation 'org.quickfixj:quickfixj-codegenerator:2.3.1'
}

// 配置代码生成任务
generateQuickfixj {
    specFile.set(file('src/main/resources/FIX44.xml'))
    targetDirectory.set(layout.buildDirectory.dir('generated-sources/quickfixj'))
    packageName.set('com.yourorg.fix.messages')
    messagePackage.set('com.yourorg.fix.messages')
}

// 让编译任务依赖生成任务,确保先生成再编译
tasks.compileJava.dependsOn(tasks.generateQuickfixj)
// 将生成的代码目录加入源码集,让编译器能识别
sourceSets.main.java.srcDir(tasks.generateQuickfixj.targetDirectory)

关键注意点

  • 直接复用QuickFIX-J的CodeGenerator核心类,无需依赖Maven的AbstractMojo及相关API,避免冗余依赖。
  • 使用Gradle的类型安全属性(Property/DirectoryProperty等),支持延迟配置和增量构建,只有输入变化时才会重新执行生成任务。

内容的提问来源于stack exchange,提问作者Grant Birchmeier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 05:57:39