首页 > 解决方案 > Gradle/Java:使用可执行的 Java 类生成资源

问题描述

情况如下:

我设法想出了一个 hacky 解决方案,它在“类”任务之后运行生成器,并将资源写入$buildDir/resources/main/schema

ext {
    schemaGenerator = "org.something.JsonSchemaGenerator"
    serviceContractsDir = file("$buildDir/service-contracts")
    schemaOutputDir = file("$buildDir/resources/main/schema")
}

task jsonSchemas(type: Exec) {
    dependsOn classes
    dependsOn serviceContracts

    commandLine "java", "-classpath", sourceSets.main.runtimeClasspath.getAsPath(), schemaGenerator, serviceContractsDir, schemaOutputDir
}

test.dependsOn jsonSchemas
assemble.dependsOn jsonSchemas

这很好用,然后生成的资源包含在 JAR 中。
但是在上传工件时,它会上传没有生成资源的 JAR。

我试图以正确的方式做到这一点:

ext {
    schemaOutputDir = file("$buildDir/generated-resources")
}

sourceSets.main.output.dir schemaOutputDir, builtBy: jsonSchemas

但是我最终得到了一个循环依赖,因为 Gradle 需要资源来构建类,并且生成这些资源的任务也取决于类:

FAILURE:构建失败并出现异常。
出了什么问题:
以下任务之间的循环依赖:
:classes
--- :jsonSchemas
    --- :classes (*)

有没有办法将它们添加到正确的源集(as generated-resources)所以它们是

标签: javagradle

解决方案


添加一个独立于主 SourceSet 的新 SourceSet 应该可以解决问题:

task jsonSchemas(type: Exec) {
  // same as above
}

sourceSets {
  schema {
    output.dir(schemaOutputDir, builtBy: 'jsonSchemas')
  }
  test {
    resources.srcDirs += [sourceSets.schema.output]
  }
}

jar {
  from sourceSets.schema.output
}

推荐阅读