关于Grails reload gsp页面的解决办法

大东哥 发布于 2009/09/06 00:19
阅读 1K+
收藏 1

以前因为一直在边玩着边学习grails,一直没有仔细研究部署问题。

现,正式用grails开发一个公司的小网站,发现grails应用在打包成war文件发布时,修改gsp页面,服务器不会reload。这个问题受到美工MM和同事的一致BS。决心解决。

到网上查找,文档相当少。

大部份的解决方案:在config.groov 加上:grails.gsp.enable.reload=true

初一看,字面上感觉可以解决问题。然而,修应用打包部署到tomcat6中,启动时,出现如下异常:

java.lang.IllegalStateException: Cannot check reload enabled, [grails.reload.location] or [base.dir] not set! Specify the system property.
 at grails.util.Environment.getReloadLocation(Environment.java:173)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:597)
 at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
 at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
 at groovy.lang.MetaClassImpl.getProperty(MetaClassImpl.java:1607)
 at groovy.lang.ExpandoMetaClass.getProperty(ExpandoMetaClass.java:954)
 at groovy.lang.MetaClassImpl.getProperty(MetaClassImpl.java:3303)
 at groovy.lang.ExpandoMetaClass.getProperty(ExpandoMetaClass.java:967)
 at org.codehaus.groovy.runtime.InvokerHelper.getProperty(InvokerHelper.java:159)
 at org.codehaus.groovy.runtime.callsite.PojoMetaClassGetPropertySite.getProperty

继续查,方案:

在Config.groovy中,加上

grails.reload.location='D:/apache-tomcat-6.0.20/webapps/TestReload/WEB-INF/grails-app'
base.dir='D:/apache-tomcat-6.0.20/webapps/TestReload/WEB-INF/grails-app'

很容易理解,是指定reload页面的目录,grails项目的gsp面页在/WEB-INF/grails-app 下。

打包,部署。启动tomcat时,问题依旧。

查看源码:

grails.util.Environment 某段是这样写的:

    public String getReloadLocation() {
        String location = getReloadLocationInternal();
        if(isNotBlank(location)) {
            return location;
        }
        else {
            throw new IllegalStateException("Cannot check reload enabled, ["+RELOAD_LOCATION+"] or ["+BuildSettings.APP_BASE_DIR+"] not set! Specify the system property.") ;
        }
    }
 
    private String getReloadLocationInternal() {
        String location = System.getProperty(RELOAD_LOCATION);
        if(!isNotBlank(location)) location = System.getProperty(BuildSettings.APP_BASE_DIR);
        return location;
    }
}
  
看来异常是从这抛的:
    
    public String getReloadLocation() {
        String location = getReloadLocationInternal();
        if(isNotBlank(location)) {
            return location;
        }
        else {
            throw new IllegalStateException("Cannot check reload enabled, ["+RELOAD_LOCATION+"] or ["+BuildSettings.APP_BASE_DIR+"] not set! Specify the system property.") ;
        }
    }
 
当然的会想到,在grails的某处加上:System.setProperty("base.dir","xxxxx")。
于是在:BootStrap.groovy()的init方法中加上    

         System.setProperty("base.dir","D:/apache-tomcat-6.0.20/webapps/TestReload/WEB-INF/grails-app")
         println System.getProperty("base.dir")
不打包,不部署,直接用grails run-app 看到控制台打印出了信息。
欣喜。立马:grails war。拷贝到tomcat上,启动。。。
异常依然如旧。
心情开始烦燥,开始怀疑是grails的Bug,BS起grails了。难道要修改grails的原代码?
再想想,连个System.setProperty("base.dir","D:/apache-tomcat-6.0.20/webapps/TestReload/WEB-INF/grails-app")都搞不定,还搞什么Java开发。
修改系统环境变量!!我的电脑->高级->环境变量 开始建base.dir环境变量。虽然知道不行,但还是想试试。
启动,问题依旧。。。。
最后的尝试。。。。,不行就改原码!!
Config.groovy中有一段:
environments {
    production {
         grails.serverURL = "http://www.changeme.com"
    }
    development {
        grails.serverURL = "http://localhost:8080/${appName}"
    }
    test {
        grails.serverURL = "http://localhost:8080/${appName}"
    }
}
于是想到在production{}中,加上 
System.setProperty("base.dir","D:/apache-tomcat-6.0.20/webapps/TestReload/WEB-INF/grails-app")
打包,部署。启动tomcat6。
问题解决。
哎,还是经验不够。
注:grails版本grails1.1.1,操作系统xp sp2。
加载中
0
爆皮王
爆皮王

原来是这样呀。。学习一下。。。

返回顶部
顶部