当前位置: 首页 > 知识库问答 >
问题:

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

公西鸿博
2023-03-14

我使用jsonschema生成器基于我的POJO生成JSON模式文件。目前,我正在通过一个在<code>gradle构建</code>步骤中运行的测试来完成这项工作。这工作正常,但感觉不对,因为我所做的并不是测试任何东西。

我还找到了这个答案,其中详细说明了如何在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个答案

云默
2023-03-14

JavaExec插件似乎满足了您的要求。

这允许您运行< code>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 如果您的自定义任务被定义为任务 generateJsonSchema(type: JavaExec) { ... }

 类似资料:
  • 主要内容:执行多个任务,排除任务,发生故障时继续构建,选择执行哪些构建,获取构建信息Gradle提供了一个命令行来执行构建脚本。 它可以一次执行多个任务。在这里将介绍如何使用不同的选项来执行多个任务。 执行多个任务 可以从单个构建文件执行多个任务。使用命令处理构建文件。此命令将按列出的顺序编译每个任务,并使用不同的选项执行每个任务以及依赖关系。 示例 - 假设有四个任务 - ,,和。和取决于和。 看看下面的图表。 在上面的四个任务是相互依赖的,用一个箭头符号表示。 看看下面的代码

  • 我试图生成我的REST API客户端Android使用OpenAPI生成器从build.gradle脚本。这样,我就不必每次规格改变时都运行生成器命令行。理想情况下,这将在我构建/组装我的应用程序时生成,源将最终在java(生成)文件夹中,在那里生成的源可以从代码中访问(这就是BuildConfig.java文件的情况)。 下面是他们官方GitHub的链接,这里是构建。我最终得到的gradle文件

  • 如何从gradle运行另一个gradle脚本。我有多个gradle脚本在

  • 每当我开始或运行我的项目时,gradle build运行从未停止,我尝试创建新的项目,但没有任何事情发生。有些项目工作得很好,但有些不是,而且永远在梯度构建运行中。而且,每当我打开项目时,这个cmd appt.exe文件就会打开。

  • 问题内容: 我有以下代码行可运行批处理文件, 但是我希望它在后台运行,而不是向用户显示命令行。我该如何更改才能做到这一点? 问题在于命令窗口打开并中断程序GUI。我只希望命令窗口在执行批处理文件时不可见。 问题答案: 完全删除“开始”将完成您想要的操作(因为这就是创建窗口的原因): 我已经对此进行了测试,并且可以正常工作,当然,如果您想与命令提示符进行通信,则必须具有输入和输出流,也不要忘记您的错

  • 我的一个项目需要Java1.8,但有时我们没有注意到我们使用的是较旧的Java,所以我们会得到一些奇怪的错误。 我想在中添加检查功能,这样当我们运行任何任务时,它都会首先检查版本,并立即打印错误和退出。 我尝试在第一行的中直接添加检查,但它仍然在检查发生之前执行一些其他任务,例如(、),当我运行: 如何正确地去做?