Grails:应用程序运行时的CLI交互

时间:2015-03-01 15:53:16

标签: grails

在应用程序运行时,通过命令行与Grails交互有什么不好吗?例如,我有一个应用程序通过grails run-app目标在我的本地机器上运行,然后我打开另一个命令提示符并创建了一个域类,我注意到它创建了域类和等效的测试类但在另一个我运行应用程序的终端我得到了相当多的红色文本:

    | Error 2015-03-01 10:40:10,392 [Thread-10] ERROR plugins.AbstractGrailsPluginManager
  - Plugin [domainClass:2.3.8] could not reload changes to file [C:\Users\user\Dropbo
x\MoeStuff\Projects\qotd\grails-app\domain\qotd\Quote.groovy]: Ambiguous method overl
oading for method grails.spring.BeanBuilder#registerBeans.
Cannot resolve which method to invoke for [null] due to overlapping prototypes betwee
n:
        [interface org.codehaus.groovy.grails.commons.spring.RuntimeSpringConfigurati
on]
        [interface org.springframework.beans.factory.support.BeanDefinitionRegistry]
Message: Ambiguous method overloading for method grails.spring.BeanBuilder#registerBe
ans.
Cannot resolve which method to invoke for [null] due to overlapping prototypes betwee
n:
        [interface org.codehaus.groovy.grails.commons.spring.RuntimeSpringConfigurati
on]
        [interface org.springframework.beans.factory.support.BeanDefinitionRegistry]
    Line | Method
->> 3034 | chooseMostSpecificParams     in groovy.lang.MetaClassImpl
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|   2986 | chooseMethodInternal         in     ''
|   2929 | chooseMethod . . . . . . . . in     ''
|   1204 | getMethodWithCachingInternal in     ''
|   3163 | createPogoCallSite . . . . . in     ''
|   1306 | createPogoCallSite           in groovy.lang.ExpandoMetaClass
|    147 | createPogoSite . . . . . . . in org.codehaus.groovy.runtime.callsite.CallS
iteArray
|    161 | createCallSite               in     ''
|     45 | defaultCall . . . . . . . .  in     ''
|    108 | call                         in org.codehaus.groovy.runtime.callsite.Abstr
actCallSite
|    116 | call . . . . . . . . . . . . in     ''
|    156 | doCall                       in org.codehaus.groovy.grails.plugins.DomainC
lassGrailsPlugin$_closure3
|     -2 | invoke0 . . . . . . . . . .  in sun.reflect.NativeMethodAccessorImpl
|     57 | invoke                       in     ''
|     43 | invoke . . . . . . . . . . . in sun.reflect.DelegatingMethodAccessorImpl
|    606 | invoke                       in java.lang.reflect.Method
|   1254 | jlrMethodInvoke . . . . . .  in org.springsource.loaded.ri.ReflectiveInter
ceptor
|     90 | invoke                       in org.codehaus.groovy.reflection.CachedMetho
d
|    233 | doMethodInvoke . . . . . . . in groovy.lang.MetaMethod
|   1086 | invokeMethod                 in groovy.lang.MetaClassImpl
|   1110 | invokeMethod . . . . . . . . in groovy.lang.ExpandoMetaClass
|    910 | invokeMethod                 in groovy.lang.MetaClassImpl
|    411 | call . . . . . . . . . . . . in groovy.lang.Closure
|    767 | invokeOnChangeListener       in org.codehaus.groovy.grails.plugins.Default
GrailsPlugin
|    716 | notifyOfEvent . . . . . . .  in     ''
|    731 | notifyOfEvent                in     ''
|    409 | informOfClassChange . . . .  in org.codehaus.groovy.grails.plugins.Abstrac
tGrailsPluginManager
|    367 | informOfFileChange           in     ''
|    243 | informPluginManager . . . .  in org.codehaus.groovy.grails.compiler.Grails
ProjectWatcher
|     46 | access$400                   in     ''
|    169 | onNew . . . . . . . . . . .  in org.codehaus.groovy.grails.compiler.Grails
ProjectWatcher$1
|    210 | cacheFilesForDirectory       in org.codehaus.groovy.grails.compiler.Direct
oryWatcher
|    204 | cacheFilesForDirectory . . . in     ''
|    187 | checkForNewFiles             in     ''
|    163 | run . . . . . . . . . . . .  in     ''
^    178 | run                          in org.codehaus.groovy.grails.compiler.Grails
ProjectWatcher

任何人都可以谈谈这个错误的含义吗?是否可以首先做我正在做的事情,或者我是否应该始终停止应用程序运行,然后向grails发出任何与artefact创建/修改有关的命令或者与Grails进行CLI交互?感谢。

2 个答案:

答案 0 :(得分:1)

在创建工件时停止应用程序是最佳做法。只要您没有对类层次结构进行重大修改,您通常可以通过保持应用程序运行来实现修改。

原因是在开发模式下,Grails会监视更改工件并尝试重新加载这些更改。在创建的情况下,它可能会在错误的时间点击并混淆您的应用程序(您在问题中看到的内容)。

重新加载已更改的/新资源(特别是域类)并不完美,但它在大多数情况下都能正常工作。在创建过程中避免头痛并停止应用程序。

答案 1 :(得分:1)

所以grails将尝试编译并加载对文件的更改。所以你在这里看到的是grails试图编译你修改过的文件或正在修改的文件,但它失败了。

现在grails加载和编译更改的效果有点受欢迎。它会加载它们,但有时它不起作用,服务器需要重新启动。此外,观察文件所需的处理器数量可能会过载,尤其是在服务器运行时检出新代码时。

这会伤害到什么吗?好吧不,它可能会或可能不会工作。您的服务器可能无法反映更改,或者它可能会给出错误的响应,而不是代码所说的,因为它无法加载该代码。更改域对象可能会影响您的数据库或持久层,但某些更改可能与您的数据库不兼容,因此您必须停止它。