我想创建一个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'
}
首先,让我们隔离 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)
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 插件中,使其可供潜在的重用,并避免在构建脚本中分散注意力