【发布时间】:2013-11-12 16:24:40
【问题描述】:
我必须在不使用外部数据库的情况下从正在运行的应用程序中显示一些部署级别参数。第一个是战争建造日期时间。有什么方法可以让我的 tomcat 部署的 grails 应用程序知道构建的时间?
另外,我们有什么方法可以指定战争的提交修订,然后可以由应用程序读取?读取修订号的脚本是外部任务,但我关心的是在自动构建战争时传递这个值,而应用程序在部署时读取它。
【问题讨论】:
我必须在不使用外部数据库的情况下从正在运行的应用程序中显示一些部署级别参数。第一个是战争建造日期时间。有什么方法可以让我的 tomcat 部署的 grails 应用程序知道构建的时间?
另外,我们有什么方法可以指定战争的提交修订,然后可以由应用程序读取?读取修订号的脚本是外部任务,但我关心的是在自动构建战争时传递这个值,而应用程序在部署时读取它。
【问题讨论】:
您可以通过scripts/_Events.groovy 添加eventCreateWarStart 来执行此操作。此事件在最终 web 应用程序的内容在暂存目录中组装之后但在压缩它们以生成 WAR 之前触发。您可以在暂存目录中创建新文件以将它们包含在 WAR 中。例如:
eventCreateWarStart = { warName, stagingDir ->
ant.exec(executable:'read-revision-number',
output:"${stagingDir}/WEB-INF/classes/revision.txt") {
arg(value:'any-argument-the-script-needs')
}
}
这将运行脚本并将其输出放入 WAR 中,您可以使用 AnyClassInYourApplication.getResource("/revision.txt") 从代码中读取它。
您可以在构建时使用完全相同的原则,通过放置类似的东西
new File(stagingDir, "WEB-INF/classes/build.timestamp").text = "${new Date()}"
在eventCreateWarStart内。
如果你想变得更聪明,让你的脚本以与 Java 兼容的“属性”格式文件输出详细信息,例如
my.app.revision=123456
my.app.build.timestamp=Fri Nov 01 14:25:30 GMT 2013
然后在您应用的Config.groovy 中将classpath:build-details.properties 添加到grails.config.locations,然后将通过grailsApplication.config 获得详细信息。
【讨论】:
以上答案适用于 grails2,但是任何寻找 grails 3 解决方案的人都可以使用buildProperties 任务
buildProperties {
inputs.property("info.app.build.date", new Date().format('yyyy-MM-dd HH:mm:ss'))
}
它将在 meta-info/grails.build.info 文件中添加到战争中
同样的方法可用于 git commit 或任何其他细节。
看这篇文章How to add build date and other custom information to grails war
【讨论】: