我想要什么:
我想建立一个自动部署管道-我的计划如下:
我创建了两个.war
文件,使用gradle构建脚本将它们分别命名为prod.war
和test.war
,并将它们部署到我的tomcat服务器。
我的问题:
prod.war
需要访问生产数据库(mongoprod
),而test.war
必须访问测试数据库(mongotest
)。
我的尝试:
我以为我可以使用Spring配置文件,并且...
application-context.xml
中的一行:<mongo:db-factory id="mongoDbFactory" dbname="mongoprod"/>
<mongo:db-factory id="mongoDbFactory" dbname="${mongo.db.name}"/>
<filename>
:<content
>):application-production.properties
:mongo.db.name=mongotest
application-test.properties
:mongo.db.name=mongoprod
production
或test
,然后使用相应的.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'
}
有人知道我如何解决我的问题,或者可以给我有用的信息吗?
答案 0 :(得分:1)
您需要提供一个由bootRun
任务运行的主类名称,例如:
springBoot {
mainClassName = 'org.baeldung.DemoApplication'
}
您可以在tutorial
中了解更多信息更新:
可以如下配置应用程序插件
application {
mainClassName = 'org.gradle.sample.Main'
}
中所述
答案 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.war
和test.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可以以某种方式缩短,例如...