如何编写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
相关产品推荐
相关产品推荐

