如何在Gradle中支持多种语言(Java和Scala)的多个项目?

我正在尝试将过时的Ant构建转换为Gradle。 该项目包含大约Java 50子项目和10个Scala子项目。 Java项目仅包含Java,Scala项目仅包含Scala。 每个项目都是由Java和Scala构建的,这大大减慢了我们的构建速度。

我想在root build.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 } } 

当我运行我的构建时,我得到以下输出,请注意:esb-server:compileJava:esb-server:compileScala包含相同的警告,因此这些类正在构建两次。 另请注意,每个其他项目都包含compileJavacompileScala

 :common:assemble :esb-server:compileJava Note: Some input files use or override a deprecated API. Note: Recompile with -Xlint:deprecation for details. :esb-server:compileScala Note: Some input files use or override a deprecated API. Note: Recompile with -Xlint:deprecation for details. :esb-server:processResources UP-TO-DATE :esb-server:classes :esb-server:jar :esb-server:assemble :plugins:compileJava UP-TO-DATE :plugins:compileScala UP-TO-DATE :plugins:processResources UP-TO-DATE :plugins:classes UP-TO-DATE :plugins:jar :plugins:assemble :raas-transform:assemble :saxonee-helper:assemble :scala-common:compileJava UP-TO-DATE :scala-common:compileScala /Users/iain.hull/code/trunk/ccdev/scala-common/src/com/workday/esb/assembly/audit/TreeAudit.scala:138: method first in trait IterableLike is deprecated: use `head' instead override def getLast():Option[AuditNode] = if (children.isEmpty) None else children.first.getLast ^ one warning found :scala-common:processResources UP-TO-DATE :scala-common:classess :scala-common:jar :scala-common:assemble :plugins:hibernatepersistence:compileJava Note: Some input files use or override a deprecated API. Note: Recompile with -Xlint:deprecation for details. Note: Some input files use unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. :plugins:hibernatepersistence:compileScala Note: Some input files use or override a deprecated API. Note: Recompile with -Xlint:deprecation for details. Note: Some input files use unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. :plugins:hibernatepersistence:processResources :plugins:hibernatepersistence:classes :plugins:hibernatepersistence:jar :plugins:hibernatepersistence:assemble 

我知道在我的根build.gradle顶部的两个apply plugin行导致了这种行为。 但是,如果我只将正确的插件应用于每个子项目,我无法将公共配置重构为我的根build.gradle 。 另一种方法是只使用Scala插件,但这是最好的方法吗?

我可以使用Java插件编译Java项目和Scala插件来编译Scala项目,还是将所有项目中的公共构建配置重构为root build.gradle吗? 在Gradle中支持多种语言的最佳方法是什么?

这样的事情怎么样:

 configure(subprojects.findAll {project -> file('src/main/java').exists() }) { apply plugin: 'java' } 

 configure(subprojects.findAll {project -> file('src/main/scala').exists() }) { apply plugin: 'scala' } 

因为您的源目录是src ,所以需要在闭包内部使用其他一些鉴别器机制。