在gradle上的war任务之前替换文件中的字符串$ {stringKey}

时间:2016-01-29 08:38:43

标签: java gradle

我有一个多项目gradle配置。所以每个子项目都有一个build.gradle,另一个我定义了一般任务。

基本上,在常规build.gradle文件中,我列出了执行环境,每个环境都适用于productionpre-productiondevelopment等目的。

我设置了几个定义类的容器:

class RemoteContainer {
    String name
    String container
    String hostname
    Integer port
    String username
    String password
    String purpose
}

因此,我将容器设置purpose字段的目的设置为'production''pre-production''development'

然后,我可以创建几个容器:

def developmentRemoteContainers = [
    new RemoteContainer(
        name: 'wildfly8',
        container: 'wildfly8x',
        hostname: '----',
        port: ----,
        username: '----',
        password: '----'
        purpose: 'development'
    ),
    new RemoteContainer(
        name: 'glassfish4',
        container: 'glassfish4x',
        hostname: '----',
        port: ----,
        username: '----',
        password: '----'
        purpose: 'development'
    )
]

def preproductionRemoteContainers = [
    new RemoteContainer(
        name: 'wildfly8',
        container: 'wildfly8x',
        hostname: '----',
        port: ----,
        username: '----',
        password: '----'
        purpose: 'pro-production'
    ),
    new RemoteContainer(
        name: 'glassfish4',
        container: 'glassfish4x',
        hostname: '----',
        port: ----,
        username: '----',
        password: '----'
        purpose: 'pre-production'
    )
]

def productionUserRemoteContainers = [
    new RemoteContainer(
        name: 'wildfly8',
        container: 'wildfly8x',
        hostname: '---',
        port: ----,
        username: '----',
        password: '----'
        purpose: 'production'
    ),
    new RemoteContainer(
        name: 'glassfish4',
        container: 'glassfish4x',
        hostname: '----',
        port: ----,
        username: '----',
        password: '----'
        purpose: 'production'
    )
]

之后,我根据每个远程容器的内容创建任务:

示例任务:

remoteContainers.each { config ->
    task "deployRemote${config.name.capitalize()}"(type: com.bmuschko.gradle.cargo.tasks.remote.CargoDeployRemote) {
        description = "Deploys WAR to remote Web Application Server: '${config.name}'."
        containerId = config.container
        hostname = config.hostname
        port = config.port
        username = config.username
        password = config.password
        dependsOn war
    }

    task "undeployRemote${config.name.capitalize()}"(type: com.bmuschko.gradle.cargo.tasks.remote.CargoUndeployRemote) {
        description = "Deploys WAR to remote Web Application Server: '${config.name}'."
        containerId = config.container
        hostname = config.hostname
        port = config.port
        username = config.username
        password = config.password
    }
}

因此,这就是我为每个容器创建部署和取消部署任务以及执行上下文的方式。

因为你能够找出每个任务取决于战争任务。所以,我的项目有一个包含${stringKey}字符串的文件,我需要根据每个容器的目的替换它。

因此,${stringKey}必须替换为config.purpose

修改

基本上有两个文件:

  • /src/main/resources/META-INF/persistence.xml下:此文件包含数据库服务器位置信息。根据服务器环境,数据库位置是IP / PORT / DATABASE ...例如:

    <property name="hibernate.ogm.datastore.host" value="${ip}"/> <property name="hibernate.ogm.datastore.port" value="${port}"/>

  • /src/main/resources/configuration.settings.environtment下:此文件仅包含此行scope = ${scope}

必须在war代进行替换。

我绝对不知道该怎么做。 有什么想法吗?

3 个答案:

答案 0 :(得分:0)

如果只需要替换占位符,你可以尝试这样的东西

tasks.taskName.doFirst {
            exec {
                commandLine "perl", "-pi","-w","-e","s/${stringKey}/"+config.purpose+"/g" ,"filePath"
            }
        }
    }

答案 1 :(得分:0)

您可以使用ant.replace执行此操作:

replaceTokens << {
    ant.replace(
        file:  "path/to/your/file",
        token: "stringtoreplace",
        value: config.purpose
    )
}

war.dependsOn replaceTokens

答案 2 :(得分:0)

我遇到了一个类似的问题。我发现更容易保持单独的环境(例如dev,qa,staging,prod等)特定的属性/ settings / config,然后在构建生命周期中的适当时间加载/应用特定的环境。以下链接很有帮助:

  1. https://blog.gradle.org/maven-pom-profiles
  2. Gradle : Copy different properties file depending on the environment and create jar
  3. PS:我回答了一个较旧的问题,但希望这些指针对面临类似问题的人有所帮助。