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

标签 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变量是不同的。
我有一个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/

相关文章:

java - 我如何获取存储到 android 中的文件中的所有 logcat 条目

eclipse - gradle ide eclipse 插件导入 gradle 项目构建模型导致 UnsatisfiedLinkError : net

Java - MySQL 调用存储过程

java - 新的 Gradle 依赖项未添加到项目和外部依赖项 (VSCode)

android - Gradle:找不到 ID 为 'android-library' 的插件

android - 由于构建风格问题,无法添加动态功能模块

android - 无法解决gradle构建szagurskii

Java MySQL 执行更新 SQLSyntaxErrorException

java - 检查字符串是否有允许值以外的值。 java

java - JsonIninclude 无法防止延迟初始化的 NULL OneToMany 关系的映射异常