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

如何在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=

我想把我们古老的蚂蚁建筑改造成格拉德尔。该项目包含大约50个Java子项目和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
    }
}
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构建,不想在那里实现这种更改。