2017-06-29 91 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