你如何在Java 11中调用schemagen?

根据Oracle文档,作为JEP 320( http://openjdk.java.net/jeps/320 )的一部分,schemagen工具将从JDK中删除。 JEP指向现在提供缺失工具的Maven工件。 JEP中工件的坐标是错误的,更新的坐标可以在这个问题的答案中找到: 我应该在Maven项目中使用哪些工件用于JAXB RI?

然而,缺少的是如何调用工具。 JEP中指向的shell脚本位于JAXB-RI Git存储库中。 但是,这些脚本仍然没有文档,很难调用。 该git repo中的构建指令表明它是使用标准的“mvn clean install”构建的,但是它不会产生与此处文档中使用的“bin”文件夹相匹配的输出结构: https : //javaee.github.io /jaxb-v2/doc/user-guide/ch04.html#tools-schemagen

理想情况下,我想从Gradle运行schemagen,避免使用shell脚本,因为它们不是从maven依赖项中获取的。

我当前的尝试改编自调用旧的schemagen.exe的工作版本,如下所示:

(’real’build.gradle文件中有更多内容用于指定我的应用程序的依赖项等)

configurations { schemagenTool } dependencies { schemagenTool "org.glassfish.jaxb:jaxb-jxc:${jaxbVersion}" } task schemaGen(type: Exec, dependsOn: [compileJava,configurations.schemaGenTool]) { workingDir projectDir executable 'java' doFirst { file('build/Schemas').mkdirs() args '--module-path', "${configurations.schemaGenTool.asPath}", '-m', 'jaxb.jxc/com.sun.tools.jxc.SchemaGeneratorFacade', // Note: automatic module name is NOT com.sun.tool.jxc // as documented // Args to schemagen (these worked for the schemagen.exe) '-d', 'build/Schemas', '-classpath', "${compileJava.destinationDir}${File.pathSeparator}${configurations.compile.asPath}", "src/main/java/path/to/my/ModelClass.java" //println "\nschemagen: ${args.join(' ')}\n" } doLast { // Above creates "build/Schemas/schema1.xsd" (despite printing a different path!) // Rename it def destFile = file('build/Schemas/model.xsd') destFile.delete() if (!file('build/Schemas/schema1.xsd').renameTo(destFile)) { throw new GradleException("Failed to write new build/Schemas/model.xsd") } } } 

但是,这会导致错误:

 Error occurred during initialization of boot layer java.lang.module.ResolutionException: Modules jaxb.runtime and jaxb.core export package com.sun.xml.bind.marshaller to module relaxngDatatype 

这个问题似乎与jaxb-*:2.3.0版本 – #jaxb-v2 / issues / 1168有关 。 此外,这将通过将在jaxb运行在java-9上的已知问题中标记的未来版本来解决。

您可以在评论后解决此问题 –

请尝试2.4.0-b180725.0644 – 这是使用java.xml.bind模块(9,10)在JDK上运行的JPMS模块化RI和没有它的那些(11-ea)

或尝试从同一链接下载二进制发行版。

Schemagen和xjc shell脚本仅放在./bin目录中的二进制分发中。

对于构建工具,有一些插件( Maven / Gradle )可以调用schemagen和xjc API,为用户提供简单的配置。

您尝试手动调用com.sun.tools.jxc.SchemaGeneratorFacade也是正确的,这是Maven的类似示例 。 但是,您可能在模块路径上放置了2.3.0,这有一个拆分包问题。 使用classpath将解决2.3.0的问题。 JAXB的下一个版本将准备好JPMS并声明模块描述符。 您可以尝试beta版本(2.4.0-b180725.0644),这是一组正确的依赖项:

  org.glassfish.jaxb jaxb-runtime    org.glassfish.jaxb jaxb-xjc    org.glassfish.jaxb jaxb-jxc