【问题标题】:problems when trying to compile groovy class inside a java class尝试在 java 类中编译 groovy 类时出现问题
【发布时间】:2019-07-02 17:35:42
【问题描述】:

我们目前需要将应用程序从 Grails 2.x 迁移到 Grails 3.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() { ... }
}

【问题讨论】:

  • 信息太少,无法帮助您。你有什么问题?
  • @daggett 添加了几行代码。不要认为它很有用,因为这就是我所拥有的。在 grails 2 中,此代码有效,在 grails 3 中,不再有效
  • 似乎 Java 在 groovy 之前编译。检查编译步骤和插件。如果将 Java 更改为 groovy 扩展会怎样?顺便说一句,文件位置是什么?
  • @daggett 它们位于 src/main/java 和 src/main/groovy 下。更改扩展名不会解决问题,因为在 Groovy 文件中我们有一些特定的 groovy 注释
  • @daggett "如果你把 Java 改成 groovy 扩展会怎么样?" - 这是个坏主意。

标签: java grails groovy


【解决方案1】:

它们位于 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 源代码编译为一个单元,从而实现双向依赖。
  • 另一种方法是将src/main/java/ 添加到sourceSetscompileGroovy,这样这些源代码将与src/main/groovy/ 下的源代码同时编译。如果你这样做,它可以工作,但更多的是构建配置,因为你偏离了默认值,并且是一个非标准的东西。
猜你喜欢
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多