我正在使用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模式生成。
此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) { ... }