java - schemagen Ant 任务未按预期使用 gradle
问题描述
因为来自 JAXB 的 schemagen 工具不再是 JDK 11 的一部分,所以我想使用 gradle 设置一个项目,该项目通过可用的 ant 任务提供 schemagen 工具的功能。虽然,我让它运行 ant 任务并没有按预期运行。特别是创建的模式与源代码注释不匹配。
此外,总是抛出一个我无法解决的异常。
我在带有 bash shell 的 Windows 10 机器上使用版本 2.3.2 中的 JDK 11、Gradle 5.4.1 和 JAXB。
项目看起来像这样(一个 gradle java 项目):
Movie.java
里面src/main/java/movie
:
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
:
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
(我缩短了输出文件系统路径和不必要的信息)
尽管任务失败,但创建了一个模式,schema1.xsd
:
<?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 被忽略了,流派只是作为一个元素包含在内。
我会期待这样的事情:
<?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 任务中获得了有效的模式?
解决方案
对于任何正在寻找解决方案的人。这是由于 schemagen 对类路径没有所需的依赖关系。
在 schemagen 依赖配置中添加所需的依赖。对于 @XmlRootElement,依赖项是 bind-api。
然后使用 classpath { pathelement(path:) } 为 schemagen 设置类路径,如下所示。
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)
}
}
}
推荐阅读
- grpc - 如何对 grpc 服务进行负载测试,任何示例代码将不胜感激
- apache-spark - Univocity CSV Parser setDelimiter 方法的 Spark java.lang.NoSuchMethodError
- angular - 在 Angular 应用程序中定义和使用 xhook
- typescript - 为什么打字稿中的“any”会丢失强类型?
- c - 使用 sprintf 函数后 C 中字符串和整数数组的内存存储差异
- javascript - webassembly 加载时间过长
- html - Angular 在单击按钮时为整个页面内容设置动画
- c# - SignalR Core:来自静态控制器方法的集线器上下文
- mysql - 在数据库中的滑块上显示多个图像
- javascript - 如何使用 Expo 散列缓冲区。加密货币。摘要字符串异步()