通过构建脚本更改mongo dbname

时间:2019-04-24 16:43:27

标签: spring mongodb gradle

我想要什么:
我想建立一个自动部署管道-我的计划如下:
我创建了两个.war文件,使用gradle构建脚本将它们分别命名为prod.wartest.war,并将它们部署到我的tomcat服务器。

我的问题:
prod.war需要访问生产数据库(mongoprod),而test.war必须访问测试数据库(mongotest)。

我的尝试:
我以为我可以使用Spring配置文件,并且...

  1. ...从以下位置更改我的application-context.xml中的一行:
    <mongo:db-factory id="mongoDbFactory" dbname="mongoprod"/>
    到:
    <mongo:db-factory id="mongoDbFactory" dbname="${mongo.db.name}"/>
  2. ...在同一文件夹中创建两个文件(<filename><content>):
    application-production.propertiesmongo.db.name=mongotest
    application-test.propertiesmongo.db.name=mongoprod
  3. ...执行带有参数的gradle构建脚本,该脚本可以将配置文件更改为productiontest,然后使用相应的.property文件插入所需的mongo dbname。 。但是那是我运气不好的地方!
    我试图将其添加到我的build.gradle文件中:
    bootRun { args = ["--spring.profiles.active=" + profiles] }
    然后使用$ ./gradlew bootRun -Ptest
    运行它 但我得到了错误:
    Main class name has not been configured and it could not be resolved
    并且除了我以前没有使用过bootRun以外,到目前为止只有一个war任务可以创建我的.war文件:
    war { archiveName = 'application.war' dependsOn 'lessc', 'webpack' from "$buildDir/webapp" exclude 'WEB-INF/js/main.js' rename 'main\\.min\\.js', 'main.js' }

有人知道我如何解决我的问题,或者可以给我有用的信息吗?

2 个答案:

答案 0 :(得分:1)

您需要提供一个由bootRun任务运行的主类名称,例如:

springBoot {
    mainClassName = 'org.baeldung.DemoApplication'
}

您可以在tutorial

中了解更多信息

更新

可以如下配置应用程序插件

application {
    mainClassName = 'org.gradle.sample.Main'
}

plugin docs

中所述

答案 1 :(得分:0)

我发现,就我的情况而言,决定在运行时决定使用测试数据库还是生产数据库要容易得多(我认为更好),我通过以下方式解决了问题:
在我的application-context.xml中,我创建了两个bean而不是一个,每个数据库一个(我必须将它们嵌套在“根” bean下面,否则在构建过程中会出错):

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mongo="http://www.springframework.org/schema/data/mongo"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.5.xsd">

    <beans profile="prod">
        <mongo:db-factory id="mongoDbFactory" dbname="mongoprod"/>

        <mongo:mapping-converter id="mongoConverter" base-package="my.company.project">
            <mongo:custom-converters base-package="my.company.project"/>
        </mongo:mapping-converter>

        <mongo:gridFsTemplate bucket="images" converter-ref="mongoConverter" db-factory-ref="mongoDbFactory"/>
    </beans>

    <beans profile="test">
        <mongo:db-factory id="mongoDbFactory" dbname="mongotest"/>

        <mongo:mapping-converter id="mongoConverter" base-package="my.company.project">
            <mongo:custom-converters base-package="my.company.project"/>
        </mongo:mapping-converter>

        <mongo:gridFsTemplate bucket="images" converter-ref="mongoConverter" db-factory-ref="mongoDbFactory"/>
    </beans>

</beans>

为了使.war文件创建正常进行,我必须在以下build.gradle文件中将enabled设置为true

war {
    enabled = true //without this no .war file was created before - https://stackoverflow.com/a/52315049/4120196
    dependsOn 'lessc', 'webpack'
    from "$buildDir/webapp"
    exclude 'WEB-INF/js/main.js'
    rename 'main\\.min\\.js', 'main.js'
}

然后我创建了一个.war文件,将其复制并重命名-所以我有两个:prod.wartest.war并将它们放入我的Tomcat 8.5_Tomcat8.5.23\webapps文件夹中(我正在研究Win10(如果在其他系统上有所不同)。然后,我创建了两个与.war文件同名的.xml文件,在其中定义了spring概要文件,该概要文件决定了在Tomcat 8.5_Tomcat8.5.23\conf\Catalina\localhost中采用哪个bean:
prod.xml

<Context>
  <Environment name="spring.profiles.active" value="prod" type="java.lang.String" override="false" />
</Context>

test.xml

<Context>
  <Environment name="spring.profiles.active" value="test" type="java.lang.String" override="false" />
</Context>  

我启动了tomcat,最终一切都按我的意愿工作了。

如果您有任何建议可以改善我的解决方案,请随时发表评论:)
我觉得我的application-context.xml可以以某种方式缩短,例如...