如何在Gradle中支持多种语言(Java和Scala)的多个项目?
我想把我们古老的蚂蚁建筑改造成格拉德尔。该项目包含大约50个Java子项目和10个Scala子项目。Java项目只包含Java,Scala项目只包含Scala。每个项目都是由Java构建的,然后是Scala,这大大降低了我们的构建速度 我希望在root build.gradle文件中放置尽可能多的公共逻辑,如下所示:如何在Gradle中支持多种语言(Java和Scala)的多个项目?,java,scala,build,gradle,Java,Scala,Build,Gradle,我想把我们古老的蚂蚁建筑改造成格拉德尔。该项目包含大约50个Java子项目和10个Scala子项目。Java项目只包含Java,Scala项目只包含Scala。每个项目都是由Java构建的,然后是Scala,这大大降低了我们的构建速度 我希望在root build.gradle文件中放置尽可能多的公共逻辑,如下所示: subprojects { apply plugin: 'java' apply plugin: 'scala' sourceCompatibility=
subprojects {
apply plugin: 'java'
apply plugin: 'scala'
sourceCompatibility=1.7
targetCompatibility=1.7
sourceSets {
main {
scala {
srcDir 'src'
}
java {
srcDir 'src'
}
}
test {
scala {
srcDir 'test'
}
java {
srcDir 'test'
}
}
}
repositories {
mavenCentral()
}
dependencies {
scalaTools "org.scala-lang:scala-compiler:2.9.3"
compile "org.scala-lang:scala-library:2.9.3"
}
// Use the sbt compiler (not scalac ant task)
tasks.withType(ScalaCompile) {
scalaCompileOptions.useAnt = false
}
task showCompileClasspath << {
sourceSets.main.compileClasspath.each { println it }
}
test {
systemProperty "user.dir", projectDir
}
}
configure(subprojects.findAll {project ->
file('src/main/java').exists()
}) {
apply plugin: 'java'
}
我知道我的根build.gradle
顶部的两行apply plugin
导致了这种行为。但是,如果我只对每个子项目应用正确的插件,我就无法将公共配置重构到我的根build.gradle
。另一种方法是什么都使用Scala插件,但这是最好的方法吗
我可以使用Java插件编译Java项目,使用Scala插件编译Scala项目,并且仍然可以将所有项目中的公共构建配置重构到根
build.gradle
?在Gradle中,支持这种多语言的最佳方式是什么?类似的方式如何:
subprojects {
apply plugin: 'java'
apply plugin: 'scala'
sourceCompatibility=1.7
targetCompatibility=1.7
sourceSets {
main {
scala {
srcDir 'src'
}
java {
srcDir 'src'
}
}
test {
scala {
srcDir 'test'
}
java {
srcDir 'test'
}
}
}
repositories {
mavenCentral()
}
dependencies {
scalaTools "org.scala-lang:scala-compiler:2.9.3"
compile "org.scala-lang:scala-library:2.9.3"
}
// Use the sbt compiler (not scalac ant task)
tasks.withType(ScalaCompile) {
scalaCompileOptions.useAnt = false
}
task showCompileClasspath << {
sourceSets.main.compileClasspath.each { println it }
}
test {
systemProperty "user.dir", projectDir
}
}
configure(subprojects.findAll {project ->
file('src/main/java').exists()
}) {
apply plugin: 'java'
}
因为您的源目录是
src
,所以闭包中还需要一些其他的鉴别器机制。正如scala插件上的Gradle文档所说-scala插件扩展了Java插件以添加对scala项目的支持
。而且compileScala
实际上依赖于compileJava
这就是为什么您看到它们都在为每个项目执行感谢您的输入,但我知道这一点。但是,用java和scala支持项目的最佳方式是什么?因为它包含java,所以是否将一切都当作scala?如果我们决定在将来添加groovy项目,会发生什么?它必须具备scala和groovy的特性吗?在担心这一点之前,我应该标准化我的源集结构吗?这行不通,请仔细查看他的源集定义。没有src/main/java
或src/main/scala
,只有src
。这就是我在闭包中提到或使用任何其他鉴别器的原因。它只是有条件地应用插件的一个例子。感谢您的回答,我不知道configure
函数,我可能可以稍微不同地使用它。将apply plugin
语句放在相应的子项目中,然后使用configure
查找具有java性质的子项目,并对这些子项目进行配置,同样地,对scala项目进行配置。虽然我担心执行的顺序,但我非常喜欢使用默认的maven/gradle源集。这是我计划在gradle启动并运行后看到的东西。目前,我必须维护ant构建,不想在那里实现这种更改。