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 部分
我有一个设置,其中我从 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 部分