2017-06-29 83 views
0

我正嘗試從gradle中的多個.xsd s中生成類。嘗試像下面,但它不工作,我得到錯誤,file not existsGradle Jaxb插件問題

buildscript { 
ext { 
    springBootVersion = '1.5.4.RELEASE' 
} 
repositories { 
    jcenter() 
    mavenCentral() 
} 
dependencies { 
    classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") 
    classpath("com.github.jacobono:gradle-jaxb-plugin:1.3.6") 
} 
} 
apply plugin: 'java' 
apply plugin: 'eclipse-wtp' 
apply plugin: 'org.springframework.boot' 
apply plugin: 'war' 
apply plugin: 'com.github.jacobono.jaxb' 

version = '0.0.1-SNAPSHOT' 

repositories { 
    mavenCentral() 
} 

configurations.all { 
    exclude module: 'spring-boot-starter-logging' 
} 

configurations { 
    jaxb 
} 

task createDirs { 
    file("$buildDir/generated-sources").mkdirs() 
} 
xjc.dependsOn createDirs 

jaxb { 
    xsdDir = "src/main/resources/xsd" 
    xjc { 
     destinationDir = "$buildDir/generated-sources" 
     taskClassname = "org.jvnet.jaxb2_commons.xjc.XJC2Task" 
     generatePackage = "com.test.generated1" 
     args = ["-Xinheritance", "-Xannotate"] 
    } 
} 

compileJava { 
    dependsOn(xjc) 
} 

compileTestJava { 
    dependsOn(xjc) 
} 

dependencies { 
    compile('org.springframework.boot:spring-boot-starter-web') 
    compile('org.springframework.boot:spring-boot-starter-log4j2') 
    compile('org.springframework.boot:spring-boot-starter-actuator') 
    jaxb('org.jvnet.jaxb2_commons:jaxb2-basics-ant:0.6.5') 
    jaxb('org.jvnet.jaxb2_commons:jaxb2-basics:0.6.4') 
    jaxb('org.jvnet.jaxb2_commons:jaxb2-basics-annotate:0.6.4') 
    jaxb('com.sun.xml.bind:jaxb-xjc:2.2.7-b41') 
    jaxb('com.sun.xml.bind:jaxb-impl:2.2.7-b41') 
} 

如果我刪除destinationDir = file("build/generated-sources"),它會產生內部src/main/java類,我不想要的。

我得到錯誤.../build/generated-sources: non-existent directory

任何幫助表示讚賞:)

注:搖籃版本3.2.1

+0

嘗試使用構建目錄'「$ buildDir/generated-sources」的變量' – LazerBanana

+0

將jaxb.dependsOn更改爲xjc.dependsOn,因爲xjc是實際任務 – LazerBanana

+0

這會導致'執行失敗的任務':xjc'。 .... /建立/生成源:不存在的目錄錯誤返回 – Raj

回答

2

嘗試使用變量構建目錄"$buildDir/generated-sources"

像吸血鬼注意到您需要先創建目錄。

我會建議使用doFirst()來爲它創建一個任務,它將在執行階段更早執行。

task createDirs { 
    doFirst{ 
     file("$buildDir/generated-sources").mkdirs() 
    } 
} 

,然後再運行,如果XJC前:

xjc.dependsOn createDirs 

嘗試只是將原始/build路徑和這個任務特定的任務,因爲它看起來像destinationDir已經指向了根。不知道這裏發生了什麼。除此之外,我強烈sugest usign變量$buildDir

jaxb { 
    xsdDir = "src/main/resources/xsd" 
    xjc { 
     destinationDir = "build/generated-sources" 
     taskClassname = "org.jvnet.jaxb2_commons.xjc.XJC2Task" 
     generatePackage = "com.test.generated1" 
     args = ["-Xinheritance", "-Xannotate"] 
    } 
} 

的另一件事是,你可以在目錄上的變化看,如果你不希望運行昂貴的XJC任務所有的時間。

xjc { 
    inputs.dir ("$projectDir/src/main/resources/xsd") 
    outputs.dir ("$buildDir/generated-sources") 
} 
+0

同樣的錯誤'::不存在的目錄' – Raj

+0

我想我應該去爲不同的插件。我會自己寫這個任務,但是隻是開始建立gradle,不多想法 – Raj

+0

你是否創建了一個創建dirs的任務? – LazerBanana

0

的一點是,你應該使用變量buildDir而不是使用硬編碼'build'的。

雖然這不是你的問題。你的問題是,你使用的插件不會創建一個不存在的目標目錄。因此,創建操作添加到任務像

jaxb { 
    doFirst { 
     file("$buildDir/generated-sources").mkdirs() 
    } 
} 

或者,如果你願意的話,創建一個單獨的任務,確實只有目錄的創建,然後從jaxb添加一個依賴於你的目錄的創建任務。

+0

這很奇怪我的項目不需要mkdir在這一個,我想這可能是問題,但你是否也需要在這裏使用file()?我剛剛創建了一個虛擬項目,它接受一個字符串作爲路徑而不創建它。 – LazerBanana

+0

嗯,好吧,我從來沒有使用過這個插件,我只是從描述的效果中假設它的行爲 – Vampire