如何在构建时从Gradle运行Java代码

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

我正在使用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();
        }
    }
}
java gradle jsonschema2pojo
1个回答
0
投票

JavaExec Plugin似乎满足您的要求。

这允许您运行main()方法,从而运行您想要的任何Java代码-包括您喜欢的任何JSON模式生成。

other answer还描述了您想做什么。


改编自链接的文档:

apply plugin: 'java'

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

  main = 'package.Main'

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

根据下面Jorn的评论:

您可以将构建任务依赖于您的自定义任务:build.dependsOn generateJsonSchema,如果您的自定义任务定义为task generateJsonSchema(type: JavaExec) { ... }

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