java - 使用 gradle 对不同环境进行恒定路径替换
问题描述
这是一个基于 Apache Storm 的项目。我有一个看起来像这样的常量文件
public class Constant {
public static final String CONTEXT_PATH ="<some path to a context.xml file>";
public static final String APP_PROPERTIES_PATH = "<path to the properties file>";
//...More static properties
}
这个 CONTEXT_PATH 变量对于不同的环境(dev、test、prod)是不同的。
我有一个 gradle 任务,它生成用于部署的 JAR 文件
task stormJar(type: Jar) {
baseName = 'diagnostic'
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
with jar
}
我希望动态更改或引用 CONTEXT_PATH 变量,以便我们可以为不同的环境创建构建,而无需对此文件进行任何更改。
我相信在 Android 领域 (BuildConfig) 有这样做的解决方案,但无法为普通的 Java 项目找到解决方案。
解决方案应该是这样的,它应该适用于 IDE(IntelliJ 和 Eclipse)以及创建特定于环境的构建。
做类似下面的事情应该可以完成工作
gradlew build -pEnvironment=prod
gradle的经验不多。请指出我正确的方向。
解决方案
请注意这里有一个工作示例。
一种技术是生成Constants.java
作为构建的一部分。考虑这个模板(存储为资源,而不是 Java 代码):
public class Constants {
public static final String CONTEXT_PATH = "__CONTEXT_PATH";
public static final String APP_PROPERTIES_PATH = "__APP_PROPERTIES_PATH";
}
并在任务Constants.java
早期生成以下内容:compileJava
compileJava.doFirst {
def newConstantsFile = new File("${projectDir}/src/main/java/net/codetojoy/util/Constants.java")
def templateConstantsFile = new File("${projectDir}/resources/TemplateConstants.java")
newConstantsFile.withWriter { def writer ->
templateConstantsFile.eachLine { def line ->
def newLine = line.replace("__PACKAGE", "net.codetojoy.util")
.replace("__CONTEXT_PATH", getContextPath())
.replace("__APP_PROPERTIES_PATH", getAppPropertiesPath())
writer.write(newLine + "\n");
}
}
}
然后是关键的特定于环境的谓词:
def getContextPath = { ->
def result = "default"
if (project.Environment == "prod") {
result = "PROD context path here"
} else if (project.Environment == "uat") {
result = "UAT context path here"
} else if (project.Environment == "dev") {
result = "DEV context path here"
}
return result
}
def getAppPropertiesPath = { ->
def result = "default"
if (project.Environment == "prod") {
result = "PROD app properties path here"
} else if (project.Environment == "uat") {
result = "UAT app properties path here"
} else if (project.Environment == "dev") {
result = "DEV app properties path here"
}
return result
}
请注意,特定于 ENV 的值可以很容易地抽象为配置文件、ENV 变量等。
另请注意,示例地址:package
使用的 Java、项目版本和构建时间戳。我为大多数项目写了这样的东西。
推荐阅读
- terminal - 仅从 grep -n 中取出前两个值
- java - Jenkinsfile:从另一个脚本传递 env
- c - 如何处理异步输入和同步输出?
- python - Kivy FileChooser 重叠
- c - 给定数组的最大大小,我应该写完所有内容并在最后缩小还是每次都扩展?
- php - 如何在 Laravel 中验证模型对象实例?
- snowflake-cloud-data-platform - Snowflake 中的暂存数据:下载了 snowsql 但仍无法使用“put”命令
- rest - 通过 IP 识别的替代方法
- python - 字典中的 KeyError 但键存在
- neural-network - 我可以在flux.jl中计算NN输出wrt网络输入的autograd吗?