2013-10-11 13 views
6

Zaimplementowałem niestandardowe zadanie w groovy. Jeśli podaję klasę narzędziową dla niej zaimplementowaną w groovy (X.groovy) i umieszczę ją w buildsrc, to zadanie działa. Jeśli wdrożyć równoważne klasy w Javie (Y.java) i umieścić go w tym samym katalogu, zadanie nie powiedzie się z następującym komunikatem o błędzie:Gradle nie ładuje plików klas Java skompilowanych ze źródła Java umieszczonego w buildsrc

:buildsrc:compileGroovystartup failed: 
General error during conversion: Could not load class 'com.myinc.gradle.api.data.Y' 
from file:/project/buildsrc/build/classes/main/com/myinc/gradle/api/data/Y.class. 

Plik Y.class istnieje w miejscu określonym w błędzie wiadomość. Kompilacja nie powiedzie się podczas Y.java jest w jednej z typowych miejscach:

buildsrc/src/main/groovy/.../Y.java<br> 
buildsrc/src/main/java/.../Y.java 

dokumentacji Gradle mówi „można po prostu umieścić swój kod źródłowy budować w tym katalogu i trzymać się konwencji układu dotyczącego projektu Java/Groovy "i zostanie zastosowany domyślny skrypt kompilacji buildsrc.
Źródło: http://www.gradle.org/docs/current/userguide/organizing_build_logic.html#sec:build_sources

Układ projektu pozwala, aby katalogi źródłowe Groovy zawierały kod Groovy i Java.
Źródło: http://www.gradle.org/docs/current/userguide/groovy_plugin.html#sec:groovyCompile

Aby replikować:

projekt/build.gradle:

task t (type: sample.MyTask) { 
    println "configuring task" 
} 

projekt/buildsrc/src/main/groovy/próbkę


MyTask.groovy

package sample 

import org.gradle.api.DefaultTask 
import org.gradle.api.tasks.TaskAction 

class MyTask extends DefaultTask { 
    @TaskAction 
    public void task() { 
    println 'task action' 
    new X().m() 
// new Y().m() // uncommenting this line should generate an error when you build 't' 
    } 
} 

X.groovy

package sample; 
class X { 
    void m() { 
    println "x.m" 
    } 
} 

Y.java

package sample; 
public class Y { 
    void m() { 
    System.out.println("y.m"); 
    } 
} 

OSX 10.8.4, IntelliJ 12,1, Gradle 1,8

Odpowiedz

1

tylko pomysł: Być może jest to związane z deklaracją pakietu. Java jest tutaj bardziej wybredna niż groovy i oczekuje pliku źródłowego w odpowiednim katalogu. Nie udało mi się odtworzyć Twojego problemu. Czy możesz podać mały, samodzielny projekt, który demonstruje twój problem?

okrzyki, René

+0

Uruchomiłem powyższy kod w kontekście mojego większego projektu w IntelliJ, ale działa on w czystym projekcie poza IntelliJ. Będę musiał wyjaśnić, co w większym kontekście powoduje problem. – wjohnson

2

problem w szerszym kontekście była niezgodność w wersjach kodu bajtowego między wczesną wersją dostępu JDK8 i co ładowacz klasy w groovyCompile w Gradle 1,8 spodziewa. Kiedy zmieniłem poziomy językowe w IntelliJ z powrotem na JDK7, wszystko działało dobrze.