Как запустить Java код из Gradle во время сборки - PullRequest
4 голосов
/ 09 марта 2020

Я использую jsonschema-generator , чтобы сгенерировать файл схемы JSON на основе моих POJO. В настоящее время я делаю это с помощью теста, который выполняется во время шага gradle build. Это работает нормально, но это не совсем правильно, так как на самом деле я ничего не тестирую.

Я также нашел этот ответ , в котором подробно описано, как запустить его на 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();
        }
    }
}

1 Ответ

2 голосов
/ 05 апреля 2020

Плагин JavaExe c , кажется, соответствует вашим требованиям.

Это позволяет вам запускать метод 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 ниже:

Вы можете зависеть от задачи сборки от вашей пользовательской задачи: build.dependsOn generateJsonSchema, если ваша пользовательская задача определена как task generateJsonSchema(type: JavaExec) { ... }

...