2013-04-05 53 views
3

我想将我们过时的Ant构建转换为Gradle。该项目包含Java 50子项目和10个Scala子项目。 Java项目只包含Java和Scala项目,只包含Scala。每个项目都是由Java构建,然后是Scala,这大大减缓了我们的构建。如何在Gradle中支持多语言(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 
    } 
} 

当我运行我的体型,我得到下面的输出中,请注意: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 

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

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

+0

作为斯卡拉摇篮文件插件说 - “Scala插件扩展了Java插件以添加对Scala项目的支持”。而'compileScala'实际上依赖于'compileJava'这就是为什么你看到它们都在为每个项目执行 – 2013-04-05 08:11:47

+0

感谢您的意见,但是我知道这一点。然而,用java和scala支持项目的最佳方式是什么?它只是把所有东西都当作scala,因为它包含了java?如果我们决定在未来添加一个groovy项目会发生什么?它必须具备Scala和Groovy性质吗?我应该在担心这个之前将我的源代码结构标准化吗? – iain 2013-04-05 18:28:04

回答

3

怎么是这样的:

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目录是 'src' 中,需要封盖内的一些其他鉴别机制

+0

这不起作用,请仔细查看他的源代码定义。没有'src/main/java'或'src/main/scala',只有'src'。 – 2013-04-05 14:06:46

+0

没错,这就是为什么我提到**或在封闭内部使用任何其他鉴别器的原因。它只是服务器作为有条件应用插件的示例。谢谢 – 2013-04-05 14:13:45

+0

感谢您的回答,我不知道'configure'函数,我可能稍微有点不同。将'apply plugin'语句放在各自的子项目中,然后使用'configure'来查找具有java性质的子项目并为scala项目配置这些子项目。虽然我担心执行的顺序。 – iain 2013-04-05 17:54:52