我正在维护我没有编写的Grails应用程序(我没有使用Groovy / Grails的经验,实际上:))并且它目前在其部署的某个环境上有一个错误,而不是其他环境。
为了调试这个,我想跳到受影响的服务器上的grails shell,运行我怀疑容易出错的命令,看看我得到了什么结果,看看接下来我的调试去哪里。
将应用程序放入带有grails prod war
命令的war文件中,scp'd到要部署的服务器,并使用jar -xvf /path/to/war
提取。
当我在grails shell中时,我无法访问域中定义的任何类。
这是我尝试的:
`
]$ ~/grails-1.0.4/bin/grails shell
Welcome to Grails 1.0.4 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: /home/me/grails-1.0.4
Base Directory: /var/home/me/skills_test/WEB-INF
Running script /home/me/grails-1.0.4/scripts/Shell.groovy
Environment set to development
[copy] Copying 1 file to /home/me/.grails/1.0.4/projects/WEB-INF
[copy] Copying 1 file to /home/me/.grails/1.0.4/projects/WEB-INF
Jun 11, 2009 2:35:19 PM java.util.prefs.FileSystemPreferences$7 run
WARNING: Prefs file removed in background /home/me/.java/.userPrefs/org/codehaus /groovy/tools/shell/prefs.xml
Groovy Shell (1.5.6, JVM: 10.0-b22)
Type 'help' or '\h' for help.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
groovy:000> new User()
ERROR org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed, groovysh_evaluate: 2: unable to resolve class User
@ line 2, column 1.
1 error
at Shell_groovy$_run_closure2.doCall (Shell_groovy:71)
at org.codehaus.gant.GantMetaClass.invokeMethod (GantMetaClass.java:79)
at org.codehaus.gant.GantMetaClass.invokeMethod (GantMetaClass.java:94)
at Shell_groovy$_run_closure2.doCall (Shell_groovy)
at org.codehaus.gant.GantMetaClass.invokeMethod (GantMetaClass.java:79)
at org.codehaus.gant.GantMetaClass.invokeMethod (GantMetaClass.java:79)
at org.codehaus.gant.GantMetaClass.invokeMethod (GantMetaClass.java:94)
at Shell_groovy$_run_closure1.doCall (Shell_groovy:37)
at org.codehaus.gant.GantMetaClass.invokeMethod (GantMetaClass.java:79)
at org.codehaus.gant.GantMetaClass.invokeMethod (GantMetaClass.java:94)
at Shell_groovy$_run_closure1.doCall (Shell_groovy)
at org.codehaus.gant.GantMetaClass.invokeMethod (GantMetaClass.java:79)
at org.codehaus.gant.GantMetaClass.invokeMethod (GantMetaClass.java:79)
at gant.Gant.dispatch (Gant.groovy:271)
at gant.Gant.this$2$dispatch (Gant.groovy)
at gant.Gant.invokeMethod (Gant.groovy)
at gant.Gant.processTargets (Gant.groovy:436)
at gant.Gant.processArgs (Gant.groovy:372)
groovy:000> import User
ERROR org.codehaus.groovy.tools.shell.CommandException: Invalid import definition: 'import User'; reason: startup failed, script1244745379552.groovy: 1: unable to resolve class User
@ line 1, column 1.
1 error
at Shell_groovy$_run_closure2.doCall (Shell_groovy:71)
at org.codehaus.gant.GantMetaClass.invokeMethod (GantMetaClass.java:79)
at org.codehaus.gant.GantMetaClass.invokeMethod (GantMetaClass.java:94)
at Shell_groovy$_run_closure2.doCall (Shell_groovy)
at org.codehaus.gant.GantMetaClass.invokeMethod (GantMetaClass.java:79)
at org.codehaus.gant.GantMetaClass.invokeMethod (GantMetaClass.java:79)
at org.codehaus.gant.GantMetaClass.invokeMethod (GantMetaClass.java:94)
at Shell_groovy$_run_closure1.doCall (Shell_groovy:37)
at org.codehaus.gant.GantMetaClass.invokeMethod (GantMetaClass.java:79)
at org.codehaus.gant.GantMetaClass.invokeMethod (GantMetaClass.java:94)
at Shell_groovy$_run_closure1.doCall (Shell_groovy)
at org.codehaus.gant.GantMetaClass.invokeMethod (GantMetaClass.java:79)
at org.codehaus.gant.GantMetaClass.invokeMethod (GantMetaClass.java:79)
at gant.Gant.dispatch (Gant.groovy:271)
at gant.Gant.this$2$dispatch (Gant.groovy)
at gant.Gant.invokeMethod (Gant.groovy)
at gant.Gant.processTargets (Gant.groovy:436)
at gant.Gant.processArgs (Gant.groovy:372)
groovy:000>
`
正如您所看到的,我无法访问“用户”类(它位于域目录中 - 那些是Grails'等同于'模型',对吗?)并且无法导入它。
我见过的grails shell使用的例子都能够很好地访问应用程序中的所有类而不导入...我做错了什么?
是因为我正在对提取的WAR文件运行grails shell吗?我怎么能绕过这个?
答案 0 :(得分:2)
问题实际上它是从提取的WAR文件开始工作的 - 我认为它需要让源.java文件正常工作。我将原始源文件复制到我遇到问题的服务器上,编辑配置以指向正确的数据源,并且能够很好地进入shell。
有些原因你无法使用解压缩的WAR文件进入目录中的shell,但我现在会接受这个,因为我找到了一个解决方法。
答案 1 :(得分:1)
我不是百分百肯定,但我认为 Groovy维护了Java强制规则,你无法导入没有包的类。
因此,请尝试删除import
语句,看看您是否可以通过这种方式使用User
对象。