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

iai*_*ain 5 java scala build gradle

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

我想在根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
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行构建时,得到以下输出,请注意: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
Run Code Online (Sandbox Code Playgroud)

我知道apply plugin我的根目录顶部的两行build.gradle正在引起这种行为。但是,如果仅将正确的插件应用于每个子项目,则无法将通用配置重构到我的根目录中build.gradle。另一种方法是仅对所有内容使用Scala插件,但这是最好的方法吗?

我可以使用Java插件来编译Java项目,也可以使用Scala插件来编译Scala项目,并且仍然可以将我所有项目中的通用构建配置重构到根目录build.gradle吗?在Gradle中支持多种语言的最佳方法是什么?

Ori*_*Dar 5

这样的事情怎么样:

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

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

由于您的源目录为src,因此需要在闭包内部使用其他鉴别器机制。