如何在构建时 运行 Java 来自 Gradle 的代码

How to Run Java Code from Gradle at Build Time

我正在使用 jsonschema-generator 基于我的 POJO 生成一个 JSON 模式文件。目前,我正在 gradle build 步骤中通过 运行 的测试来完成此操作。这工作正常,但感觉不对,因为我所做的实际上没有测试任何东西。

我还发现 this answer 详细说明了如何在 gradle run 上 运行 但这也不理想,因为每次应用程序出现时它都会毫无意义地执行它但是不是我建造的时候。

因此,有没有办法在构建时将gradle(在build.gradle中)告诉运行一段Java代码?

为了完整起见,这里是我要查找的代码 运行:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.victools.jsonschema.generator.Option;
import com.github.victools.jsonschema.generator.OptionPreset;
import com.github.victools.jsonschema.generator.SchemaGenerator;
import com.github.victools.jsonschema.generator.SchemaGeneratorConfig;
import com.github.victools.jsonschema.generator.SchemaGeneratorConfigBuilder;
import com.mypackage.MyClass;
import org.junit.jupiter.api.Test;

import java.io.PrintWriter;
import java.util.Map;

@SuppressWarnings({"FieldCanBeLocal", "rawtypes"})
public class JsonSchemaGenerator {
    private final String SCHEMA_FOLDER = "schemas/";
    private final Map<Class, String> schemaToGenerate = Map.of(
            MyClass.class, "my-class.schema"
    );

    @Test
    public void generateJsonSchema() throws Exception {
        SchemaGeneratorConfigBuilder configBuilder = new SchemaGeneratorConfigBuilder(new ObjectMapper(), OptionPreset.PLAIN_JSON);
        SchemaGeneratorConfig config = configBuilder.with(Option.DEFINITIONS_FOR_ALL_OBJECTS).build();
        SchemaGenerator generator = new SchemaGenerator(config);

        for (var entry : schemaToGenerate.entrySet()) {
            JsonNode jsonSchema = generator.generateSchema(entry.getKey());
            PrintWriter out = new PrintWriter(SCHEMA_FOLDER + entry.getValue());
            out.println(jsonSchema.toPrettyString());
            out.close();
        }
    }
}

JavaExec Plugin似乎符合您的要求。

这允许您 运行 一个 main() 方法,从而允许您使用任何 Java 代码——包括您喜欢的任何 JSON 模式生成。

这个 也描述了你想做的事情。


改编自链接文档:

apply plugin: 'java'

task generateJsonSchema(type: JavaExec) {
  classpath = sourceSets.main.runtimeClasspath

  main = 'package.Main'

  // arguments to pass to the application
  args 'appArg1'
}

根据下面 Jorn 的评论:

You can depend the build task on your custom task: build.dependsOn generateJsonSchema if your custom task is defined as task generateJsonSchema(type: JavaExec) { ... }