Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java schemagen Ant任务使用gradle时未按预期工作_Java_Gradle_Ant_Jaxb_Schemagen - Fatal编程技术网

Java schemagen Ant任务使用gradle时未按预期工作

Java schemagen Ant任务使用gradle时未按预期工作,java,gradle,ant,jaxb,schemagen,Java,Gradle,Ant,Jaxb,Schemagen,因为来自JAXB的schemagen工具不再是JDK 11的一部分,所以我想使用gradle设置一个项目,它通过可用的ant任务提供schemagen工具的功能。 尽管如此,我还是在运行ant任务时发现它的行为与预期不符。尤其是创建的模式与源代码注释不匹配 此外,总有一个异常抛出,我无法解决 我在带有bashshell的windows10机器上使用JDK 11、Gradle 5.4.1和JAXB版本2.3.2 该项目如下所示(gradle java项目): Movie.java内部src/mai

因为来自JAXB的schemagen工具不再是JDK 11的一部分,所以我想使用gradle设置一个项目,它通过可用的ant任务提供schemagen工具的功能。 尽管如此,我还是在运行ant任务时发现它的行为与预期不符。尤其是创建的模式与源代码注释不匹配

此外,总有一个异常抛出,我无法解决

我在带有bashshell的windows10机器上使用JDK 11、Gradle 5.4.1和JAXB版本2.3.2

该项目如下所示(gradle java项目):

Movie.java
内部
src/main/java/Movie

打包电影;
导入javax.xml.bind.annotation.XmlAttribute;
导入javax.xml.bind.annotation.xmlement;
导入javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
公映{
@XmlElement
公共字符串名称;
@XmlAttribute
公共弦乐体裁;
}
build.gradle

plugins {
    id 'java'
    id 'application'
}

repositories {
    jcenter()
}

configurations {
    schemagen
}

dependencies {
    implementation group: 'org.glassfish.jaxb', name: 'jaxb-runtime', version: '2.3.2'
    schemagen group: 'org.glassfish.jaxb', name: 'jaxb-jxc', version: '2.3.2'
}

def srcDir = file("src/main/java/movie")
def schemaDir = file("$buildDir/schema")

task schemagen {
    doLast {
        ant.taskdef(name: 'schemagen', classname: 'com.sun.tools.jxc.SchemaGenTask', classpath: configurations.schemagen.asPath)
        schemaDir.mkdirs()
        ant.schemagen(
            srcdir: srcDir,
            destdir: schemaDir,
            includeAntRuntime: false,
            debug: true,
            verbose: true)
    }
}
现在,当我运行
gradle schemagen--stacktrace
时,控制台上有以下输出:

> Task :schemagen FAILED
[ant:schemagen] anomalous package-info.java path: package-info.java
[ant:schemagen] [parsing started SimpleFileObject[...\src\main\java\movie\Movie.java]]
[ant:schemagen] [parsing completed 0ms]
[ant:schemagen] [parsing started SimpleFileObject[...\src\main\java\movie\package-info.java]]
[ant:schemagen] [parsing completed 0ms]
[ant:schemagen] [loading /modules/jdk.jconsole/module-info.class]
...many more
[ant:schemagen] [search path for source files: ...\src\main\java\movie]
[ant:schemagen] [search path for class files: C:\Program Files\Amazon Corretto\jdk11.0.3_7\lib\modules,...\build\schema]
[ant:schemagen] [loading /modules/java.base/java/lang/Object.class]
[ant:schemagen] [loading /modules/java.base/java/lang/String.class]
[ant:schemagen] [loading /modules/java.base/java/lang/Deprecated.class]
[ant:schemagen] [loading /modules/java.base/java/lang/annotation/Retention.class]
[ant:schemagen] [loading /modules/java.base/java/lang/annotation/RetentionPolicy.class]
[ant:schemagen] [loading /modules/java.base/java/lang/annotation/Target.class]
[ant:schemagen] [loading /modules/java.base/java/lang/annotation/ElementType.class]
[ant:schemagen] Round 1:
[ant:schemagen]         input files: {movie.Movie}
[ant:schemagen]         annotations: [XmlRootElement, XmlElement, XmlAttribute]
[ant:schemagen]         last round: false
[ant:schemagen] [loading /modules/java.base/java/lang/Character.class]
...many more
[ant:schemagen] [loading /modules/java.base/java/util/Collection.class]
[ant:schemagen] Processor com.sun.tools.jxc.ap.SchemaGenerator matches [XmlRootElement, XmlAttribute, XmlElement] and returns false.
[ant:schemagen] Round 2:
[ant:schemagen]         input files: {}
[ant:schemagen]         annotations: []
[ant:schemagen]         last round: true
[ant:schemagen] [total 297ms]

FAILURE: Build failed with an exception.

* Where:
Build file '...\build.gradle' line: 26

* What went wrong:
Execution failed for task ':schemagen'.
> schema generation failed

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':schemagen'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.accept(ExecuteActionsTaskExecuter.java:151)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.accept(ExecuteActionsTaskExecuter.java:148)
        at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:191)
        ...many more
Caused by: : schema generation failed
        at com.sun.tools.jxc.ApBasedTask.compile(ApBasedTask.java:142)
        at com.sun.tools.jxc.SchemaGenBase.compile(SchemaGenBase.java:228)
        at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:1130)
        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:293)
        at jdk.internal.reflect.GeneratedMethodAccessor314.invoke(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
        ...many more
(I缩短了输出,包括文件系统路径和不必要的信息)

尽管任务失败,但会创建一个模式,
schema1.xsd


这里忽略了
@xmldattribute
-注释,只是将体裁作为元素包含

我本以为会发生这样的事情:



是否有人成功地建立了这样一个项目,并从schemagen ant任务中获得了一个有效的模式?

对于寻找解决方案的人。这是因为schemagen在类路径上没有所需的依赖项

在schemagen依赖项配置中添加所需的依赖项。对于@XmlRootElement,依赖项是绑定api

然后使用类路径{pathelement(path:)}设置schemagen的类路径,如下所示

依赖项{
schemagen(
'jakarta.xml.bind:jakarta.xml.bind api:3.0.0-RC3',
'雅加达.激活:雅加达.激活api:2.0.0-RC3',
'com.sun.xml.bind:jaxb jxc:3.0.0-M4',
'com.sun.xml.bind:jaxb-osgi:3.0.0-M4',
'javax.xml.bind:jaxbapi:2.4.0-b180830.0359')
}
任务模式{
多拉斯特{
taskdef(名称:'schemagen',类名:'com.sun.tools.jxc.SchemaGenTask',类路径:configurations.schemagen.asPath)
schemaDir.mkdirs()
蚂蚁(
srcdir:srcdir,
destdir:schemaDir,
includeAntRuntime:false,
是的,
详细:正确){
架构(文件:“CustomSchema.xsd”,命名空间:“”)
类路径{
pathelement(路径:configurations.schemagen.asPath)
}
}

}
适用于寻找此解决方案的任何人。这是由于schemagen在类路径上没有所需的依赖项

在schemagen依赖项配置中添加所需的依赖项。对于@XmlRootElement,依赖项是绑定api

然后使用类路径{pathelement(path:)}设置schemagen的类路径,如下所示

依赖项{
schemagen(
'jakarta.xml.bind:jakarta.xml.bind api:3.0.0-RC3',
'雅加达.激活:雅加达.激活api:2.0.0-RC3',
'com.sun.xml.bind:jaxb jxc:3.0.0-M4',
'com.sun.xml.bind:jaxb-osgi:3.0.0-M4',
'javax.xml.bind:jaxbapi:2.4.0-b180830.0359')
}
任务模式{
多拉斯特{
taskdef(名称:'schemagen',类名:'com.sun.tools.jxc.SchemaGenTask',类路径:configurations.schemagen.asPath)
schemaDir.mkdirs()
蚂蚁(
srcdir:srcdir,
destdir:schemaDir,
includeAntRuntime:false,
是的,
详细:正确){
架构(文件:“CustomSchema.xsd”,命名空间:“”)
类路径{
pathelement(路径:configurations.schemagen.asPath)
}
}
}