运行 Avro Tools 的 gradle 任务

问题描述 投票:0回答:1

我想创建一个gradle任务来调用avro-tools-1.12.0.jar负责创建基于Kafka Schema的JAVA文件用于注册表。

今天我需要手动调用lib,如下所示:

我的手动命令:

java -jar C:\Users\ADM\.gradle\caches\modules-2\files-2.1\org.apache.avro\avro-tools\1.12.0\6284f370acde9a345902705f1641222c430208b5\avro-tools-1.12.0.jar compile schema .\src\main\avro\Employee.avsc .\src\main\java\

我的build.gradle:

plugins {
    id 'java'
    id 'application'
}

sourceCompatibility = 21
targetCompatibility = 21

repositories {
    mavenCentral()
    maven {
        url "http://packages.confluent.io/maven/"
        allowInsecureProtocol = true
    }
}

configurations {
    scheduleRuntime
}

dependencies {
    implementation group: 'org.apache.avro', name: 'avro', version: '1.12.0'
    implementation group: 'org.apache.avro', name: 'avro-tools', version: '1.12.0'
    implementation group: 'io.confluent', name: 'kafka-avro-serializer', version: '7.7.1'

}

application {
    // Define the main class for the application.
    mainClass = 'com.edu.sample.Main'
}
gradle
1个回答
0
投票

首先,让我们隔离 Avro Tools JAR,而不是采用从 Gradle 缓存中获取它的不可靠方法。我们可以在与主编译使用的 Gradle 配置分开的 Gradle 配置中执行此操作:

configurations {
    avroTools {
        transitive = false // So we pick up only the primary JAR and not its dependencies
    }
}

dependencies {
    avroTools group: 'org.apache.avro', name: 'avro-tools', version: '1.12.0'
}

其次,让我们为生成的代码定义一个与主源目录(应该为人类编写的源代码保留)分开的输出目录,并确保 Java 编译拾取它:

def avroGeneratedDir = layout.buildDirectory.dir("avroGenerated")
sourceSets.main.java.srcDir(avroGeneratedDir)

最后我们可以编写 Gradle 任务,它是使用

JavaExec
任务类型调用 JVM 进程。

tasks.register("avroCompileSchema", JavaExec) {
    classpath(configurations.avroTools) // Use the executable JAR from the new configuration
    args( // Specify the arguments of the JVM process
        "compile",
        "schema",
        "src\main\avro\Employee.avsc",
        avroGeneratedDir.get().asFile.canonicalPath
    )
}

对此的进一步改进将包括:

  • 指定

    avro
    源作为 avroCompileSchema 任务
    输入

  • 使 Java 编译依赖于

    avroCompileSchema
    任务,最好通过将代码生成目录作为该任务的输出来完成

    (这些将确保在修改

    .avro
    模式输入之一时强制重新运行 Java 编译)

  • 将所有这些代码整理到 Gradle 插件中,使其可供潜在的重用,并避免在构建脚本中分散注意力

© www.soinside.com 2019 - 2024. All rights reserved.