Grails编译器一次又一次地运行,可能是因为语法错误

时间:2010-12-23 03:06:55

标签: grails

我多次遇到这个问题:有时当我命令:grails run-app时,编译器只是一次又一次地运行,即使我之后没有改变。它看起来像:

Running Grails application..
Server running. Browse to http://localhost:8080/LiningTest
  [groovyc] Compiling 1 source file to E:\workspace\W1\LiningTest\target\classes

  [groovyc] Compiling 2 source files to E:\workspace\W1\LiningTest\target\classe
s
   [delete] Deleting directory C:\Documents and Settings\Long\.grails\1.3.6\proj
ects\LiningTest\tomcat
Running Grails application..
Server running. Browse to http://localhost:8080/LiningTest
  [groovyc] Compiling 1 source file to E:\workspace\W1\LiningTest\target\classes

  [groovyc] Compiling 2 source files to E:\workspace\W1\LiningTest\target\classe
s
   [delete] Deleting directory C:\Documents and Settings\Long\.grails\1.3.6\proj
ects\LiningTest\tomcat
Running Grails application..
Server running. Browse to http://localhost:8080/LiningTest
  [groovyc] Compiling 1 source file to E:\workspace\W1\LiningTest\target\classes
...

编译器在“服务器运行”时成功,但随后它会自动重新编译一些文件(我不知道哪个文件),然后重新运行,然后重新编译......

当我遇到语法错误时,我遇到过这个问题

constraint {
number(min:0.50) // the right way is "min: 0..50"
}

问题是为什么会出现这个问题,以及如何找到问题的原因。 (我想我错过了某个逗号/点,但现在很难找到,因为没有错误信息!)

更新:现在我发现问题是我在src / groovy中放置非域类时没有遵循文件夹结构规则。

3 个答案:

答案 0 :(得分:7)

首先要做的是:

grails compile -verboseCompile 

这至少会告诉你有问题的文件是什么。

显然,这可能发生在

  • 包名称与文件所在的目录(源根目录下)不匹配。
  • 班级名称与文件名不同。

看看这个: http://www.pubbs.net/201007/grails/58100-grails-user-groovyc-causing-grails-to-loop-.html

Peter Ledbrook在Groovy& amp; Grails Exchange上周(29:20): http://skillsmatter.com/podcast/java-jee/talk-by-peter-ledbrook

答案 1 :(得分:1)

我可以证实这种奇怪的行为。

src/groovy中有两个属于某个包com.acme.foobar的常规类。

虽然有一段时间一切都很顺利,Grails甚至编译了类并启动了应用程序(可以无异常使用) - 在某些时候它并没有停止编译,启动,再次删除。

我将课程放入src/groovy/com/acme/foobar后,行为立即停止。

使用grails compile -verboseCompile的说法很有用。至少你可以检查一切是否正常如下:

两次致电grails compile

如果第二次编译时编译的类输出相同,则会出现问题。

如果grails像这样喋喋不休:

Running script /Users/ug/Software/grails/scripts/Compile.groovy
Environment set to development

之后直接返回提示 - 问题应该消失。

答案 2 :(得分:0)

好吧,Grails的一个奇怪的行为是一位高级程序员告诉我:

我把我的一个非域类放在src / groovy / warm.groovy中。但warm.groovy属于“liningtest”包。看来我必须在“src / groovy / liningtest / warm.groovy”中加入“Warm”类。

这里有一个隐含的规则:

放在src / groovy中的非域类必须遵循与包结构相似的文件夹结构。

这真的是一种奇怪的行为,因为它不报告任何错误,只是一次又一次地重复编译......而对于最奇怪的部分,这对我来说是第一次有效!