【发布时间】:2014-04-05 06:21:13
【问题描述】:
我的项目同时包含 Java(N 个文件)和 Groovy 代码(仅 1 个文件)。 Java 编译依赖于这个单个 Groovy 文件的类文件进行 Java 编译(compileJava 任务成功)。
当我不使用 src/java 作为 main>groovy> sourceSet 部分中的 srcDir 之一时,我收到一条错误消息,指出在 groovy 文件/类中找不到类/符号。在 ANT 中,我们很容易首先调用 compile-groovy 目标,然后再调用 compile-java 目标,但在 Gradle 中同样是我想要找到的。
我阅读了一些帖子,发现如果我将 main>java 部分设为 NULL 并为 main>java 指定 srcDir,即 main>groovy sourceSet 部分中的 src/java,那么它编译得很好。
我的?s: 1、有没有其他办法?例如,以下应该有效:
compileJava {
dependsOn compileGroovy
}
不过,这会进入无限循环。
或
如何使用 doFirst 来执行 compileJava 任务:
compileJava {
doFirst {
compileGroovy
}
}
这也不行。
build.gradle 这行得通,但是compileJava在某种意义上在这里变得无用,即使源代码有N号。 src/java 或 src/java-test 等树中的 java 文件。我知道这个构建脚本可以工作,但如果他/她不熟悉为什么 Groovy 的 sourceSet 必须将“src/java”作为其 srcDir 值,那么从逻辑上讲,它可能会给开发人员带来一些困惑。
apply plugin: 'java'
apply plugin: 'groovy'
sourceSets {
main {
groovy {
srcDir 'src/groovy'
srcDir 'src/java'
}
java {
//The following needs to be commented out OR Gradle will always pick compileJava before compileGroovy
//srcDir 'src/java'
//srcDir 'src/java-test'
}
}
test {
groovy {
srcDir 'test/groovy'
}
java {
srcDir 'test/java'
}
resources {
srcDir 'test/resources'
srcDir 'conf'
}
}
integrationTest {
groovy {
srcDir 'src/groovy-test'
}
java {
srcDir 'src/java-test'
}
resources {
srcDir 'test/resources'
srcDir 'conf'
}
}
}
其他链接: How to make Gradle compile Groovy tests before Java tests
【问题讨论】:
-
如果您使用默认设置,但将您的 Java 文件移动到
src/main/groovy中是否有效? -
你的意思是,如果我在 sourceSets>main>groovy 中提到 src/java 并保持 sourceSets>main>java 不变(包含 src/java,因为它是 srcDir),那么它就不起作用。但是,如果您打算将所有 java 文件/with com/../.. 文件夹树从 src/java 移动到 src/groovy,那么它会起作用,因为 src/java 下没有 .java 然后即使提到 sourceSets>main>java srcDir = "src/java" 也不会做任何事情,对吧?
标签: java class groovy compilation gradle