Gradle没有加载从buildrc中放置的Java源编译的Java类文件

时间:2013-10-11 04:56:49

标签: java groovy gradle

我在groovy中实现了一个自定义任务。如果我为它在groovy(X.groovy)中实现它提供了一个实用程序类并将它放在 buildsrc 中,那么任务就可以了。如果我在Java(Y.java)中实现等效类并将其放在同一目录中,则任务失败并显示以下错误消息:

: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

Gradle文档说“你可以将你的构建源代码放在这个目录中,并坚持Java / Groovy项目的布局约定”,并将应用它的默认buildsrc构建脚本。
来源:http://www.gradle.org/docs/current/userguide/organizing_build_logic.html#sec:build_sources

Project Layout允许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,IntelliJ 12.1,Gradle 1.8

2 个答案:

答案 0 :(得分:2)

更大的上下文中的问题是JDK8的早期访问版本与Gradle 1.8中的groovyCompile中的类加载器所期望的字节码版本不兼容。当我将IntelliJ中的语言级别更改回JDK7时,一切正常。

答案 1 :(得分:1)

只是一个想法:也许它与包装声明有关。 Java比groovy更挑剔,并期望源文件在相应的目录中。我无法重现你的问题。你能提供一个小型的自我包含项目来解决你的问题吗?

欢呼声, 勒