在 Java 中讀取 Gradle 定義的變數
1. 簡介
在這個簡短的教學中,我們將探討在建置時讀取 Gradle 檔案中定義的變數的三種方法。
如果我們的程式碼需要根據建置期間定義的某些配置表現出不同的行為,這尤其有用——我們可以只定義一次變量,而不是在 Java 和 Gradle 程式碼中重複它。我們將透過程式碼產生和變數注入來解決這個問題。
2.生成Java類
首先,讓我們定義 Gradle 變數:
ext {
myVersion = '1.2.3'
}
透過在建置時產生程式碼,我們可以使 Gradle 定義的變數在 Java 程式碼中存取。
我們的第一個選擇是建立一個帶有靜態變數的 Java 最終類別檔案。為此,我們首先在 Gradle Java 編譯來源目錄中包含我們將建立類別的資料夾:
def generatedDir = "$buildDir/generated-src"
sourceSets {
main {
java {
srcDirs += "$generatedDir"
}
}
}
然後我們可以使用簡單的程式碼定義一個新的 Gradle 任務來在正確的套件中建立一個名為BuildConfig.java
的新檔案:
tasks.register('generateBuildConfig') {
doLast {
def outputDir = file("$generatedDir/com/baeldung/gradle/config")
outputDir.mkdirs()
def file = new File(outputDir, "BuildConfig.java")
file.text = """
package com.baeldung.gradle.config;
public final class BuildConfig {
public static final String MY_VERSION = "${myVersion}";
private BuildConfig() {}
}
""".stripIndent()
}
}
該檔案可能包含任意數量的變數:在這種情況下,我們只是讀取預先定義的myVersion
變數。
如果我們執行 Gradle 指令generateBuildConfig
,輸出將是放置在build/generated-src/com/baeldung/gradle/config
目錄中的這個簡單類別:
package com.baeldung.gradle.config;
public final class BuildConfig {
public static final String MY_VERSION = "1.2.3";
private BuildConfig() {}
}
而且由於我們已經在專案的來源資料夾中加入了generated-src
目錄,我們可以輕鬆地透過靜態成員存取讀取值:
assertEquals("1.2.3", BuildConfig.MY_VERSION);
最後一步是將此任務納入標準執行流程中:
compileJava.dependsOn generateBuildConfig
透過此配置,我們確保compileJava
階段將在generateBuildConfig
之後執行。
3. 生成屬性文件
我們的第二個選擇是在建置時建立一個屬性檔案。這種方法與前一種方法非常相似,但輸出和讀取值的方式會有所不同。
在這種情況下,我們需要將產生的資源資料夾包含在資源來源目錄中:
def generatedDir = "$buildDir/generated-resources"
sourceSets {
main {
resources {
srcDirs += "$generatedResourcesDir"
}
}
}
然後我們可以定義一個generateProperties
Gradle任務:
tasks.register('generateProperties') {
doLast {
def mainResourcesDir = file("$generatedResourcesDir/main")
mainResourcesDir.mkdirs()
def mainFile = file("$mainResourcesDir/version.properties")
mainFile.text = "MY_VERSION=${myVersion}"
}
}
此任務在build/generated-resources/main
目錄中建立一個名為version.properties
的屬性文件,其內容如下:
MY_VERSION=1.2.3
我們現在可以使用Properties
類別輕鬆讀取產生的屬性檔:
Properties props = new Properties();
props.load(Thread.currentThread()
.getContextClassLoader()
.getResourceAsStream("version.properties"));
String version = props.getProperty("MY_VERSION");
assertEquals("1.2.3", version);
在這種情況下,與上一個一樣,我們需要設定任務依賴關係:
compileJava.dependsOn generateProperties
透過此配置, generateProperties
任務將在compileJava
之前執行。
4. 將變數作為環境或系統屬性注入
最簡單的方法是將變數作為環境或系統屬性注入。**我們需要指定注入到我們要觸發的特定任務中的變數**。
作為範例,讓我們將變數新增到test
成績任務:
test {
systemProperty "MY_VERSION", "${myVersion}"
environment "MY_VERSION", "${myVersion}"
}
可以對其他 Gradle 任務執行相同操作,例如bootRun
任務。
讀取這些變數很簡單:
assertEquals("1.2.3", System.getProperty("MY_VERSION")); ``assertEquals("1.2.3", System.getenv("MY_VERSION"));
在這種情況下,我們不必編輯任務的執行順序。
5. 結論
在這篇短文中,我們討論了在 Java 程式碼中讀取 Gradle 定義變數的三種不同方法。每種方法適合不同的場景。
使用常量程式碼產生的優點是編譯時檢查,從而確保更少的執行時間錯誤。
透過運行時注入,我們可以獲得最動態的方法:理論上我們可以在不重新啟動應用程式的情況下更新變數的值。
上述範例的程式碼可在 GitHub 上找到。