【问题标题】:Grails shell on WAR file deploymentWAR 文件部署上的 Grails shell
【发布时间】: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 文件中作为一个普通的类。

标签: shell grails groovy


【解决方案1】:

我不是 100% 确定,但我认为 Groovy 维护着 Java 强制规则,即不能导入没有包的类。

因此,请尝试删除 import 语句,看看您是否可以通过这种方式使用 User 对象。

【讨论】:

    【解决方案2】:

    问题实际上在于它是从提取的 WAR 文件中工作的——我认为它需要存在源 .java 文件才能正常工作。我将原始源文件复制到出现问题的服务器,编辑配置以指向正确的数据源,并且能够正常进入 shell。

    由于某些原因,您无法使用解压缩的 WAR 文件进入目录中的 shell,但我现在会接受,因为我找到了解决方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-12
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 2010-09-13
      • 2016-06-13
      相关资源
      最近更新 更多