Java Gradle Jaxb插件问题

Java Gradle Jaxb插件问题,java,gradle,jaxb,Java,Gradle,Jaxb,我试图从gradle中的多个.xsd生成类。像下面这样尝试,但它不起作用,我得到的错误是文件不存在 buildscript { ext { springBootVersion = '1.5.4.RELEASE' } repositories { jcenter() mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${sprin

我试图从gradle中的多个
.xsd
生成类。像下面这样尝试,但它不起作用,我得到的错误是
文件不存在

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(“构建/生成的源代码”)
,它会在
src/main/java
中生成我不想要的类

我得到错误
../build/generated sources:不存在目录

感谢您的帮助:)


注意:Gradle版本3.2.1

尝试为生成目录使用变量
“$buildDir/generated sources”

就像吸血鬼注意到的,你需要先创建目录

我建议使用
doFirst()
为它创建一个任务,它将在执行阶段更快地执行

task createDirs {
    doFirst{
        file("$buildDir/generated-sources").mkdirs()
    }
}
然后在xjc之前运行if:

xjc.dependsOn createDirs
在这个任务中,特定的任务尝试只传递原始
/build
路径,因为它似乎已经指向根。不知道这里发生了什么。除此之外,我强烈建议使用变量
$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")
}

尝试为生成目录使用变量
“$buildDir/generated sources”

就像吸血鬼注意到的,你需要先创建目录

我建议使用
doFirst()
为它创建一个任务,它将在执行阶段更快地执行

task createDirs {
    doFirst{
        file("$buildDir/generated-sources").mkdirs()
    }
}
然后在xjc之前运行if:

xjc.dependsOn createDirs
在这个任务中,特定的任务尝试只传递原始
/build
路径,因为它似乎已经指向根。不知道这里发生了什么。除此之外,我强烈建议使用变量
$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")
}

一点是,您应该使用变量
buildDir
,而不是使用硬编码的
'build'

那不是你的问题。您的问题是,您使用的插件不会创建不存在的目标目录。因此,将创建操作添加到任务中,如

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

或者,如果愿意,可以创建一个单独的任务,只创建目录,然后将依赖项从
jaxb
添加到目录创建任务中。

一点是,您应该使用变量
buildDir
,而不是使用硬编码的
'build'

那不是你的问题。您的问题是,您使用的插件不会创建不存在的目标目录。因此,将创建操作添加到任务中,如

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


或者,如果愿意,可以创建一个单独的任务,只创建目录,然后将依赖项从
jaxb
添加到目录创建任务中。

尝试为生成目录
使用变量“$buildDir/生成的源”
将jaxb.dependsOn更改为xjc.dependsOn,因为xjc是实际任务。这会导致任务“:xjc”…”的
执行失败/构建/生成的源代码:不存在的目录
错误备份这很奇怪,它可以正常工作我刚刚试过…可能是我的gradle版本还是什么?我使用的是3.2.1。请尝试为生成目录使用变量
“$buildDir/generated sources”
将jaxb.dependsOn更改为xjc.dependsOn,因为xjc是实际任务这会导致任务的
执行失败:xjc'/构建/生成的源代码:不存在的目录
错误备份这很奇怪,它可以正常工作我刚刚试过…可能是我的gradle版本还是什么?我使用的是3.2.1。这很奇怪,我的项目不需要在这一个上使用mkdir,我想这可能是问题所在,但是您是否也需要在这里使用file()?我刚刚创建了一个虚拟项目,它接受一个字符串作为路径,而之前没有创建它。嗯,好吧,我从来没有使用过那个插件,我只是根据描述的效果假设了它的行为。这很奇怪,我的项目不需要在这个项目上使用mkdir,我想这可能是问题所在,但是你也需要在这里使用file()?我刚刚创建了一个虚拟项目,它接受一个字符串作为路径,之前没有创建它。嗯,好吧,我从来没有使用过那个插件,我只是根据所描述的效果假设了它的行为。我想我应该选择不同的插件。我会自己写这个任务,但是刚刚开始gradle,没有太多想法。你创建了一个任务来创建目录吗?是的,当然。我将修改问题并添加这些“任务不需要
$buildDir
,因为
destinationDir
首先指向根,然后添加它将在末尾添加另一个完整路径”是没有意义的。你不应该硬编码
“构建”
。如果您或任何未来的开发人员决定他不喜欢
build
as
buildDir
而是其他东西,那么如果您使用变量,它只适用于所有地方,但如果您硬编码路径,则不适用。如果你有各自的变量,硬编码的东西总是不好的。@LazerBanana好吧,那么我会说插件的实现很差,你应该向他们提出改进请求。同时,您可以执行类似于
destinationDir=“${project.relativePath(project.buildDir).replace('\\','/')}/generatedsources“
我想我应该选择不同的插件。我会自己写这个任务,但是刚刚开始gradle,没有太多想法。你创建了一个任务来创建目录吗?是的,当然。我将修改问题并添加这些“任务不需要
$buildDir
,因为
destinationDir
首先指向根,然后添加它将在末尾添加另一个完整路径”是没有意义的。你不应该硬编码
“构建”
。如果您或任何未来的开发人员决定他不喜欢
build
as
buildDir
而是其他东西,那么如果您使用变量,它只适用于所有地方,但如果您硬编码路径,则不适用。硬编码的东西总是不好的,如果