我正在使用Grails 2.4.2应用程序,并且相同的代码库用于各种客户。每个客户都可以使用自己的图标,文本字符串等来定制基于GSP的Web UI。我确保使用Config.groovy中定义的Groovy变量在GSP页面中完成自定义。即像这样的东西:
customerName = ''
favicon = ''
if (appName == 'foo') {
customerName = 'Foo'
favicon = "favicon_${appName}.ico"
}
然后从GSP页面中引用这些变量。这很好用。问题是应用程序需要为每个客户提供单独的war文件。因此CI服务器为客户A构建战争,然后运行grails clean,在application.properties文件中修改应用程序名称等,为客户B构建战争等。每个war文件构建大约需要4.5m,乘以10个客户建立。所以我认为更好的方法是构建war文件一次,然后让CI服务器复制N次,并在每个war文件中修改带有客户名称,servlet上下文路径等的application.properties文件。有人向我指出,GSP页面在war文件构建期间被编译,并且它们最终将上下文路径作为类名称的一部分。这对我来说有点奇怪。即让我们说我有Customer" Foo",我决定构建一个名为foo.war的war文件,它将部署在servlet上下文路径/ foo中。页面的编译结果" bar.gsp"会是这样的:
WEB-INF/classes/gsp_foo_bar.class
WEB-INF/classes/gsp_foo_bar_gsp_html.data
WEB-INF/classes/gsp_foo_bar_gsp_linenumbers.data
我尝试为客户A获取已编译的war文件,更改应用名称和上下文,并将其重新部署为客户B.它工作正常,我看到客户B的图标等等。所以,这个问题的摘要我猜是否可以归结为 _foo _ 部分是否将页面与上下文路径/ foo联系起来,或者它是否只是一个整容的东西?我当然不希望在运行时延迟编译或重新编译。并且因为在这种情况下GSP页面的内容基本上是静态的并且没有变化,所以看起来它不必与上下文或应用程序名称相关联。有没有人知道它是否只是一个命名的事情,或者我是否会因为每当我更改应用名称/上下文而不重新编译战争而遇到问题?也许有更好的方法来实现我想要的东西?谢谢。