当前,我们需要将应用程序从Grails 2.x迁移到Grails3.x。
我们对该应用程序了解不多,但是在过去的v2中,它在Java类中使用了Groovy类。
升级到v3后,这似乎不再起作用。在Java类中包含Groovy代码将返回此代码
...: error: cannot find symbol
line of code with the error
^
symbol: variable MyGroovyClass
location: class MyJavaClass
MyJavaClass
public class MyJavaClass {
public void x() { MyGroovyClass.test(); }
}
MyGroovyClass
class MyGroovyClass {
static void test() { ... }
}
它们被放在src / main / java和src / main / groovy下
最简单的事情以及大多数Grails应用程序要做的事情,是将所有Java和Groovy源代码都放在下src/main/groovy/
。这样一来,Groovy联合编译器就可以将它们全部编译为一个单元,因此您可以在Groovy和Java类之间具有双向依赖性。可以配置对单独目录的支持,但是它涉及一些复杂性,实际上并不会给您带来任何好处,这就是约定使用src/main/groovy
/的原因。
此解决方案有效且非常快捷。这不是一个正确的选择,但目前我可以使用它来解决。
“这不是一个正确的选择,但目前我可以使用它解决。” -很高兴您能正常使用。我们
grails create-app
创建src/main/groovy/
而不是创建不是src/main/java/
首选约定的原因是这样做。问题在于默认的构建配置,
src/main/groovy/
并且src/main/java/
是单独编译的,这意味着必须先编译一个,这意味着一个不能引用另一个,因为尚未编译。将其全部放入即可将其全部src/main/groovy/
编译在一起。Groovy提供了一个联合编译器,它允许Groovy和Java源代码被编译为1个单元,从而实现了双向依赖性。另一种方法是添加
src/main/java/
到sourceSets
用于compileGroovy
所以那些源将在相同的时间下的源被编译src/main/groovy/
。如果这样做,可以使其正常工作,但是由于偏离默认值,因此它是更多的构建配置,并且是非标准的。