2013-10-11 49 views
6

我在groovy中實現了一個自定義任務。如果我爲它在groovy(X.groovy)中實現了一個實用程序類並將其放置在buildsrc中,則該任務將起作用。如果我用Java實現(Y.java)的等價類,並將其放置在同一目錄下,則任務失敗,出現以下錯誤信息:Gradle未加載從Java源代碼編譯的Java類文件,放置在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. 

的Y.class文件存在錯誤中指定的位置信息。當Y.java處於或者平常的地方 構建失敗:

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

搖籃文檔說「你可以把你的編譯源代碼,在此目錄中,堅持爲Java/Groovy項目佈局慣例「並且其默認的buildsrc構建腳本將被應用。
來源:http://www.gradle.org/docs/current/userguide/organizing_build_logic.html#sec:build_sources

項目佈局允許Groovy源目錄包含Groovy和Java代碼。
來源:http://www.gradle.org/docs/current/userguide/groovy_plugin.html#sec:groovyCompile

要複製:

項目/的build.gradle:

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

項目/ buildsrc/src目錄/主/常規/樣品


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,12.1的IntelliJ,搖籃1.8

回答

1

只是一個想法:也許這是關係到包聲明。 Java比groovy更挑剔,並期望源文件位於相應的目錄中。我無法重現您的問題。你能否提供一個小型獨立項目來演示你的問題?

歡呼聲, 勒

+0

我已經在IntelliJ中更大的項目上下文中運行了上面的代碼,但它在IntelliJ之外的乾淨項目中工作。我必須弄清楚在更大範圍內導致問題的原因。 – wjohnson

2

在更大範圍內的問題是在JDK8,並在搖籃1.8預計提前獲得什麼版本的類加載器在groovyCompile之間的字節代碼的版本不兼容。當我將IntelliJ中的語言級別更改回JDK7時,一切正常。