Gradle 在构建任务之前执行 Java 代码

问题描述 投票:0回答:1

我有一个项目,在开始构建任务之前我必须设置某个 SystemProperty。然而,它的价值每天都在变化。

就目前情况而言,一旦构建任务开始,我就无法再以有意义的方式编辑此属性(因为覆盖被忽略)。所以我想提前做。

为了获取此属性的最新值,我有 API 调用的代码,并将从响应中提取该值。

此 API 调用位于“com.test”包下的“src/test/java”目录中名为“CallApi.java”的 Java 类中

我已将其设置为 CallApi.java 中的函数返回一个字符串,我计划在开始执行之前将其设置为 SystemProperty 的值。

我的思考过程是,如果我可以定义一个自定义任务来获取此属性的最新值,那么我可以直接使用“systemProperty”命令在 build.gradle 中设置它:

系统属性“占位符”,自定义任务

然后让 Gradle 执行清理和构建任务。

这可能吗?如果没有,是否有其他方法可以实现这一目标?

附注 我试过这个方法

import com.test.CallApi

task callApi {
    doLast {
        CallApi.getPropValue()
    }
}

getPropValue() 函数返回模拟字符串数据,但 import 语句无法解析

gradle build.gradle
1个回答
0
投票

是的,这是可能的。

总的来说,我们希望 (i) 使用 API 调用构建代码,(ii) 进行 API 调用,然后 (iii) 使用 API 调用中的数据构建其他代码。请注意,要做到这一点,您必须能够在没有 API 数据的情况下构建第 (i) 部分,否则您将面临不可调和的循环。

以下是帮助您入门的推荐方法的概述1

  1. 首先,如有必要,请分离您的代码,以便一部分进行 API 调用,另一部分使用接收到的数据。最简单的方法是将 API 调用代码放在多项目构建的一个子项目(“API 项目”)中,并将需要来自 API 的数据的代码放在单独的子项目(“主项目”)中。项目”)。

  2. 将 main 方法添加到您的 API 项目代码中,该方法将运行程序并获取所需的数据。让它将数据保存到已知位置的文件中。

  3. 应用程序插件添加到API项目。将其配置为指向获取 API 数据的 main 方法。这会在该项目中创建一个“运行”任务,它将调用 main 方法并保存 API 日期。

    application {
        mainClassName = 'fully.qualfied.name.of.api.main'
    }
    
  4. 在主项目中添加一个新任务,调用API项目运行任务并设置系统属性:

    task setSystemProperty {
        dependsOn ':apiProject:run' // run the run task first
        doLast {
            // Write code to read the created API data file and set system property
        }
    }
    
  5. 最后确保它在编译任务之前运行:

    compileJava.dependsOn setSystemProperty
    

1 此方法并未在所有方面遵循最佳实践,但涉及的配置较少。最佳实践建议不要在项目之间建立任务依赖关系,因为这种依赖关系在较大的构建中可能很脆弱。更好的方法是从 API 项目中导出额外的工件。此外,任务应该知道它们的输入和输出,以获得更健壮的代码,并允许增量构建工作。

© www.soinside.com 2019 - 2024. All rights reserved.