Java Gradle Jaxb插件问题
我试图从gradle中的多个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
.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
asbuildDir
而是其他东西,那么如果您使用变量,它只适用于所有地方,但如果您硬编码路径,则不适用。如果你有各自的变量,硬编码的东西总是不好的。@LazerBanana好吧,那么我会说插件的实现很差,你应该向他们提出改进请求。同时,您可以执行类似于destinationDir=“${project.relativePath(project.buildDir).replace('\\','/')}/generatedsources“
我想我应该选择不同的插件。我会自己写这个任务,但是刚刚开始gradle,没有太多想法。你创建了一个任务来创建目录吗?是的,当然。我将修改问题并添加这些“任务不需要$buildDir
,因为destinationDir
首先指向根,然后添加它将在末尾添加另一个完整路径”是没有意义的。你不应该硬编码“构建”
。如果您或任何未来的开发人员决定他不喜欢build
asbuildDir
而是其他东西,那么如果您使用变量,它只适用于所有地方,但如果您硬编码路径,则不适用。硬编码的东西总是不好的,如果