2015-05-29 9 views
0

我正在使用Grails 2.4.2应用程序,并且相同的代码库用于各种客户。每个客户都可以获得基于GSP的Web UI,并使用自己的图标,文本字符串等进行自定义。我已确定使用Config.groovy中定义的Groovy变量在GSP页面中完成了自定义设置。即像这样:编译的GSP页面是否与上下文路径绑定?

customerName = '' 
favicon = '' 

if (appName == 'foo') { 
    customerName = 'Foo' 
    favicon = "favicon_${appName}.ico" 
} 

这些变量然后从GSP页面中引用。这工作正常。问题是应用程序需要为每个客户提供一个单独的war文件。因此,CI服务器为客户A构建一场战争,然后运行grails clean,修改application.properties文件中的应用程序名称等,为客户B构建战争等。每个战争文件构建需要大约4.5米,乘以10个客户建立。所以我认为更好的方法是构建war文件一次,然后让CI服务器将其复制N次,并在每个war文件中修改application.properties文件,其中包含客户名称,servlet上下文路径等。有人向我指出,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 

我正在为一个客户的已编译war文件,更改应用程序名称和上下文,和重新部署它作为试验顾客B.它工作正常,并且我看到顾客B的图标等等。因此,我想问题的总结归结为零件是否将页面连接到上下文路径/ foo,或者它是简单的化妆品?我当然不希望在运行时懒惰编译或重新编译的性能受到影响。而且由于这种情况下GSP页面的内容基本上是静态的,并且不会改变,所以它似乎不必与上下文或应用程序名称绑定。有没有人知道它是否只是一个命名的东西,或者如果我更改应用程序名称/上下文时不会重新编译战争而遇到问题?也许有更好的方法来完成我想要的东西?谢谢。

+0

您GSPS的内部类的名字只是一个方式给它们命名。你真正的问题是什么?您可以在同一台服务器上使用不同的上下文路径名称部署相同的war,而不会有任何问题。你有没有尝试过? – albertovilches

+0

谢谢albertovilches。是的,我已经尝试过,但不确定它是否存在缺点,比如应用程序无法使用编译页面或类似的东西。很高兴听到情况并非如此。 – user2337270

回答

0

如何使用外部配置并在布局/模板中动态设置图标?

Grails external configuration file

+0

我不确定我明白你的意思。 favicon通过GSP页面中的变量来引用,就像现在一样。我想也许我没有明确地提出我的问题。问题是我需要为每个客户提供一份战争档案,并且我想避免为每个客户重建它。但是,在编译的GSP的类名中显示上下文路径使我认为它与上下文路径有某种联系。 – user2337270

+0

我的想法是有一个外部配置,并将所有这些客户特定信息存储在那里。然后,您将使用自己的配置运行这些应用程序。至于上下文,大多数Web容器允许您定义应用程序的上下文路径 - 请参阅http://stackoverflow.com/questions/2593472/define-servlet-context-in-war-file – defectus

+0

这几乎是我的'在做。是的,各种客户部署都有其独特的上下文路径。我想我应该改写这个问题。这不是我想知道的配置,这就是为什么上下文路径成为编译的GSP页面类的一部分,以及编译之后它是否实际上与上下文路径相关联的原因。即如果我决定在创建war文件后更改上下文路径,是否会导致GSP出现问题?我试图避免为每个客户重新创建war文件(包括编译所有Groovy代码和GSP页面)。 – user2337270