【发布时间】:2010-11-02 05:52:06
【问题描述】:
我正在维护一个不是我编写的 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 吗?我该如何解决这个问题?
【问题讨论】:
-
愚蠢的问题 - 用户可能在包中吗?将您的域类放入包中是一种很好的做法,所以也许原作者这样做了?
-
不,它在一个普通的 .groovy 文件中作为一个普通的类。