首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用gradle时schemagen任务未按预期工作

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

Stack Overflow用户
提问于 2019-05-02 20:32:36
回答 1查看 506关注 0票数 1

因为JAXB的模式工具不再是JDK 11的一部分,所以我想使用gradle设置一个项目,它通过可用ant任务提供模式工具的功能。尽管我让它运行了,但ant任务的行为并不像预期的那样。特别是创建的模式与源代码注释不匹配。

此外,总是会抛出一个异常,这是我无法解决的。

我在带有bash shell的windows10机器上使用2.3.2版的JDK11、Gradle 5.4.1和JAXB。

这个项目看起来像这样(一个gradle java项目):

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

代码语言:javascript
复制
package movie;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Movie {

    @XmlElement
    public String name;

    @XmlAttribute
    public String genre;

}

build.gradle

代码语言:javascript
复制
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时,控制台上有以下输出:

代码语言:javascript
复制
> 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

(我缩短了重新添加文件系统路径和不必要信息的输出)

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

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:complexType name="movie">
    <xs:sequence>
      <xs:element name="name" type="xs:string" minOccurs="0"/>
      <xs:element name="genre" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

这里忽略了@XmlAttribute-Annotation,类型被简单地包含为一个元素。

我想会是这样的:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:complexType name="movie">
    <xs:sequence>
      <xs:element name="name" type="xs:string" minOccurs="0"/>
    </xs:sequence>
    <xs:extension base="xs:string">
        <xs:attribute name="genre" type="xs:boolean" use="required"/>
    </xs:extension>
  </xs:complexType>
</xs:schema>

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

EN

回答 1

Stack Overflow用户

发布于 2020-09-23 10:51:56

对于任何想要解决这个问题的人。这是由于schemagen在类路径上没有所需的依赖项。

在模式依赖项配置中,添加所需的依赖项。对于@XmlRootElement,依赖项是bind-api。

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

代码语言:javascript
复制
    dependencies { 
    schemagen (
        'jakarta.xml.bind:jakarta.xml.bind-api:3.0.0-RC3',
        'jakarta.activation:jakarta.activation-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:jaxb-api:2.4.0-b180830.0359')
    }
    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){
                schema(file: "CustomSchema.xsd", namespace: "")
                classpath {
                    pathelement(path: configurations.schemagen.asPath)
                }
        }
    }

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55952554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档