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

时间:2015-06-04 10:46:20

标签: groovy gradle

我有一个设置,我在其中从java类(ProductService)调用Groovy类(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类:

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

Java类中的构造函数调用(无法编译):

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

1 个答案:

答案 0 :(得分:1)

<强>分析:

这对我来说就像一个联合编译问题。很可能转换@TupleConstructor在Groovy创建.java存根文件之后运行,导致java编译部分失败。它之前可能有用,因为你将groovy部分独立编译,然后重用现有的类文件(不干净)。遗憾的是,这是存根生成器的限制,并且如果转换应该保持在同一阶段,那么实际上没有办法解决Groovy中的问题。

<强>解决方案:

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