Groovy 生成的构造函数在编译期间丢失

Groovy generated constructor missing during compile

我有一个设置,其中我从 java class(ProductService) 调用 Groovy class(Product) 的生成构造函数 (@TupleConstructor) . IDE 显示生成的构造函数和用于工作的编译。 但是现在,不知道什么原因,编译失败了,因为编译器再也找不到参数化的构造函数了:

ProductService.java:31: error: constructor Product in class Product cannot 
be applied to given types; 
required: no arguments  
found: String,boolean,boolean,float 
reason: actual and formal argument lists differ in length

这是我当前的 gradle(2.4) 设置:

apply plugin: 'groovy'
apply plugin: 'java'

project.sourceCompatibility = 1.8
project.targetCompatibility = 1.8

sourceSets.main.java.srcDirs = []
sourceSets.main.groovy.srcDir 'src/main/java'
...
dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.4.+'
    testCompile 'org.spockframework:spock-core:1.0-groovy-2.4'
}

Groovy class:

@TupleConstructor
class Product {
    String name
    boolean bool1
    boolean bool2
    float price
}

Java中的构造函数调用class(编译失败):

...
products.add(new Product("Parliament", true, false, 10.50F));
...

分析:

这在我看来像是一个联合编译问题。最有可能的是 Groovy 之后的转换 @TupleConstructor 运行s 确实创建了 .java 存根文件,导致 java 编译部分失败。它以前可以工作,因为您独立编译了 groovy 部分,然后重新使用了现有的 class 文件(不干净)。遗憾的是,这是存根生成器的局限性,如果转换应该保持在同一阶段,那么在 Groovy 中并没有真正解决问题的方法。

解法:

  • 使用 groovy-eclipse 批处理编译器
  • 不要在存根生成器
  • 之后使用运行的转换
  • 在 gradle 中创建一个多模块构建,它将独立编译 groovy 部分