如何在构建时 运行 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) { ... }
我正在使用 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 astask generateJsonSchema(type: JavaExec) { ... }