gpt4 book ai didi

java - 使用Gradle替换不同环境的恒定路径

转载 作者:行者123 更新时间:2023-12-03 03:53:16 24 4
gpt4 key购买 nike

这是一个基于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变量是不同的。
我有一个gradle任务,它生成要部署的JAR文件
task stormJar(type: Jar) {
baseName = 'diagnostic'
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
with jar
}
我一直在寻找动态更改或引用CONTEXT_PATH变量的方法,以便我们可以为不同的环境创建版本,而无需对此文件进行任何更改。
我相信在Android Realm (BuildConfig)中可以找到解决方案,但无法为普通Java项目找到解决方案。
解决方案应该是这样的,它应该适用于IDE(IntelliJ和Eclipse)以及创建特定于环境的构建。
做下面的事情应该完成工作
gradlew build -pEnvironment=prod
没有太多的经验。请指出正确的方向。

最佳答案

请注意,有一个工作示例here
一种技术是生成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 vars等中。
还要注意,该示例解决了以下问题:使用的Java package,项目版本以及构建时间戳。对于大多数项目,我都会写类似的东西。

关于java - 使用Gradle替换不同环境的恒定路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64578015/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com