2013-04-05 33 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