2013-08-19 62 views
0

我有一個多項目Gradle構建,具有自定義的定義xjc任務來構建jaxb生成的對象,並且我正在按照正確的順序構建步驟。Gradle中的自定義任務構建順序

我有3個項目,通用,參考和產品。參考取決於共同和產品取決於參考和共同。命名對於我的問題很重要,因爲它看起來像gradle按字母順序執行某些操作,並且我已經剝離了一些其他依賴項,因爲它們不會影響問題。

在每個項目中,順序應該是jaxb,java編譯,然後scala編譯。

在頂層的build.gradle我指定的JAXB任務是:

task jaxb() { 
    description 'Converts xsds to classes' 
    def jaxbTargetFile = file(generatedSources) 
    def jaxbSourceFile = file (jaxbSourceDir) 
    def jaxbEpisodesFile = file (jaxbEpisodeDir) 
    def bindingRootDir = file (rootDir.getPath() + '/') 

    inputs.dir jaxbSourceDir 
    outputs.dir jaxbTargetFile 
    doLast { 
     ant.taskdef(name: 'xjc', classname: 'com.sun.tools.xjc.XJCTask', classpath: configurations.jaxb.asPath) 

     jaxbTargetFile.mkdirs() 
     jaxbEpisodesFile.mkdirs() 

     for (xsd in bindingsMap) { 
      if (!episodeMap.containsKey(xsd.key)) { 
       ant.fail("Entry no found in the episodeMap for xsd $xsd.key") 
      } 
      def episodeFile = projectDir.getPath() + '/' + jaxbEpisodeDir + '/' + episodeMap.get(xsd.key) 
      println("Processing xsd $xsd.key with binding $xsd.value producing $episodeFile") 
      ant.xjc(destdir: "$jaxbTargetFile", extension: true, removeOldOutput: true) { 
        schema(dir:"$jaxbSourceFile", includes: "$xsd.key") 
        binding(dir:"$bindingRootDir" , includes: "$xsd.value") 
        arg(value: '-npa') 
        arg(value: '-verbose') 
        arg(value: '-episode') 
        arg(value: episodeFile) 
      } 
     } 
    } 
} 

在產品個體的build.gradle文件我指定(在參考類似)

dependencies { 
    compile project(':common') 
    compile project(':ref') 
} 

並在我指定的所有三個項目中,我指定

compileJava.dependsOn(jaxb) 

當我在產品項目中運行發佈(或jar)時,我可以看到下面的輸出:

common:jaxb 
common:compileJava 
common:compileScala 
common:jar 
product:jaxb 
ref:jaxb 
refcompileJava 
ref:compileScala 
ref:jar 
product:compileJava 
product:compileScala 

這給了我一個錯誤,因爲在產品的XSD指裁判和裁判還沒有運行JAXB還沒有發作約束力文件ref和產品再生進口類與錯包裹名字。

如何確保ref jaxb在產品jaxb之前運行?

回答

0

如果你的產品的JAXB任務取決於爲參考,共同JAXB任務,你應該定義這種依賴性:

(在product的build.gradle)

task jaxb(dependsOn: [':common:jaxb', ':ref:jaxb']) { 
... 
} 

設置同一種依賴於ref(上commmon

+0

是的,這工作,謝謝。我希望找到一個更通用的方法,使用已經設置的依賴關係,但這確實解決了這個問題。 – Klunk

+0

你也可以試試這個:'任務jaxb(dependsOn:configurations.compile)' –