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

Groovy生成的构造函数在编译期间丢失,groovy,gradle,Groovy,Gradle,我有一个设置,在其中我从java类(ProductService)调用Groovy类(产品)的生成构造函数(@TupleConstructor)。IDE显示生成的构造函数和用于工作的编译。 但现在,由于未知原因,编译失败,因为编译器再也找不到参数化构造函数了: ProductService.java:31: error: constructor Product in class Product cannot be applied to given types; required: no ar

我有一个设置,在其中我从java类(ProductService)调用Groovy类(产品)的生成构造函数(@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)设置:

Groovy类:

@TupleConstructor
class Product {
    String name
    boolean bool1
    boolean bool2
    float price
}
Java类中的构造函数调用(编译失败):


分析:

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

解决方案:

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

我们需要查看您的代码或一个复制行为的小示例。仅Gradle文件不足以诊断您的问题。好的,我相应地更新了问题。这里仍然有一些X因素。当我用你提供的东西做一个小项目时,它对我来说很好。您是从IDE还是从命令行编译?另外,我假设您已经尝试运行了
gradleclean
?我认为选项1不适用,因为等级构建。你能给我一些关于“不要使用在存根生成器之后运行的转换”的链接/信息吗?我不知道我现在是怎么做的。是的,谢谢,我认为你考虑重用类文件是正确的,它似乎适合这种情况。很不幸,Groovy eclipse编译器没有帮助,我从中得到了相同的错误。我还读了一些groovyc的工作原理。groovy存根一代如此破碎,没有考虑/尊重groovy自己的ast注释,这有点悲哀:(groovy eclispe批处理编译器是独立的,可以在gradle构建中使用……建议它已经作为intellij idea中基于gradle构建的标准使用了……或者我读错了吗?我知道在2012年gradle 1.x(我想是1.1)中不太可能使用它)尽管如此。至于有缺陷的存根编译器……遗憾的是,这不是一个缺陷,而是一个架构限制。Groovy需要类型信息来应用转换,但要获得这些信息,我们通常需要编译形式的java类。由于在存根生成器完成工作之前,我们没有编译形式,因此我们注定会失败。这意味着需要另一种方法嗨,谢谢你的持续见解,我真的很感激。如前所述,我已经在IDEA中尝试了eclipse groovy批处理,但没有成功:“错误:(32,-1)groovy eclipse:构造函数产品(字符串、布尔值、布尔值、浮点值)未定义”“据我所知,没有办法在gradle构建中使用eclipse groovy。我在某个地方读到,gradle groovy插件没有支持它的计划,因为它不适合构建周期或其他东西。我发现的唯一一件事是一个相当死气沉沉的github项目:
@TupleConstructor
class Product {
    String name
    boolean bool1
    boolean bool2
    float price
}
...
products.add(new Product("Parliament", true, false, 10.50F));
...