2015-06-04 3 views
3

У меня есть настройка, в которой я вызываю сгенерированный конструктор (@TupleConstructor) класса Groovy (Product) из класса java (ProductService). IDE показывает сгенерированные конструкторы и компиляцию, используемые для работы. Но теперь, по неизвестным причинам, компиляция терпит неудачу, потому что компилятор оленьей кожи больше найти параметризованные конструктор:Созданный конструктор Groovy, отсутствующий во время компиляции

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)); 
... 
+0

Нам нужно будет увидеть ваш код или небольшой пример, где вы воспроизводите поведение. В файле Gradle недостаточно информации для диагностики вашей проблемы. – Keegan

+0

Хорошо, я обновил вопрос соответствующим образом. – PhilBa

+0

Здесь все еще есть X-фактор. Когда я делаю небольшой проект с тем, что вы предоставили, он компилируется для меня отлично. Вы компилируете из IDE или командной строки? Кроме того, я предполагаю, что вы пытались запустить «gradle clean»? – Keegan

ответ

1

Анализ:

Это выглядит для меня как совместный выпуск компиляции. Скорее всего, преобразование @TupleConstructor запускается после того, как Groovy создал файлы .java-заглушек, в результате чего часть компиляции java завершилась неудачей. Раньше это работало, потому что вы собрали независимую часть groovy и повторно использовали существующие файлы классов (без очистки). К сожалению, это ограничение генератора заглушки, и в Groovy нет способа исправить проблему, если преобразование должно оставаться в той же фазе.

Решение:

  • использует заводной-затмение пакетного компилятор
  • не использует преобразование, которые выполняются после того, как генератор окурка
  • создать многофункциональный модуль сборку в Gradle, который будет компилировать groovy part independent
+0

Я думаю, что вариант 1 не применим из-за сборки класса. Не могли бы вы дать мне некоторые ссылки/информацию о «не использовать преобразования, которые запускаются после генератора-заглушки»? Я не знаю, как это сделать в данный момент. – PhilBa

+0

Да, спасибо, я думаю, что вы правильно относились к повторно используемым файлам классов, похоже, это соответствует ситуации. К сожалению, компилятор Groovy-eclipse не помог, я получил от него такую ​​же ошибку. Я также немного почитал, как работает groovyc. Своеобразно печально, что поколение колоколообразных заглушек настолько сломано и не рассматривает/не оценивает собственные аннотации astovations: ( – PhilBa

+0

Пакетный компилятор groovy-eclispe является автономным и может использоваться в построении градиента ... http: //blog.jetbrains .com/idea/2015/03/quick-groovy-compilation-in-intellij-idea-14-1/предлагают, чтобы он использовался как стандарт в intellij-idea для основанных на градации сборках уже ... или я читал неправильно? Я знаю, что на самом деле это было невозможно, например, в 2012 году с помощью gradle 1.x (1.1, я думаю). – blackdrag

Смежные вопросы