【问题标题】:How to Run Java Code from Gradle at Build Time如何在构建时从 Gradle 运行 Java 代码
【发布时间】:2020-06-21 13:15:23
【问题描述】:

我正在使用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();
        }
    }
}

【问题讨论】:

  • 您可以创建一个脚本来执行 gradle build 然后 gradle run,并使用它而不只是 gradle build。
  • 感谢您的建议@Christine。我认为我不能这样做,因为它会在 CI 框上的构建过程中调出我的应用程序,这会导致构建失败并超时,因此这在我的情况下不起作用。
  • 然后你需要编辑构建文件,让它按照你想要的方式发生。
  • 嗨@VladSchnakovszki,目前正在开发一个Maven插件(github.com/victools/jsonschema-generator/issues/53)。完成此操作后,您可能能够以某种方式从您的成绩构建中触发它。

标签: java gradle jsonschema2pojo


【解决方案1】:

JavaExec Plugin 似乎符合您的要求。

这使您可以运行main() 方法,从而运行您想要的任何Java 代码——包括您喜欢的任何JSON Schema 生成。

这个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) { ... }

【讨论】:

  • ExecJavaExec 通常是正确的,但这不是一个很好的例子......而且没有其他任务依赖它。
  • 你是说这也不能包含在grade build中呢?
  • 您可以将构建任务依赖于您的自定义任务:build.dependsOn generateJsonSchema 如果您的自定义任务定义为 task generateJsonSchema(type: JavaExec) { ... }
  • @Carsten 我说/写了答案的初始版本没有使用dependsOnfinalizedBy 定义的依赖关系,正如问题所要求的那样。 Exec 任务,从命令行运行带有 java 的 JAR 可能更合适,因为那里的代码可能不会有太大变化,因此构建一次就足够了。
猜你喜欢
  • 2018-09-27
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 2021-01-17
  • 2016-10-22
相关资源
最近更新 更多