Java11 中如何调用 schemagen?

How do you invoke schemagen in Java 11?

根据 Oracle 文档,schemagen 工具已作为 JEP 320 (http://openjdk.java.net/jeps/320) 的一部分从 JDK 中删除。 该 JEP 指向现在提供缺失工具的 Maven 工件。工件的坐标在 JEP 中是错误的,更新后的坐标可以在这个问题的答案中找到: Which artifacts should I use for JAXB RI in my Maven project?

然而,缺少的是如何调用这些工具。在 JAXB-RI Git 存储库中的 JEP 中指向 shell 脚本。然而,这些脚本仍未记录且难以调用。 git 存储库中的构建说明表明它是使用标准 "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. Additionally, this would be resolved with a future release as marked in the known issues of jaxb 运行 over java-9 .

您可以resolve this关注评论 -

Please try 2.4.0-b180725.0644 - this is JPMS modularized RI working on JDKs with java.xml.bind module (9,10) and those without it (11-ea)

try downloading来自相同link的二进制分布。

Schemagen 和 xjc shell 脚本仅放入 ./bin 目录中的 binary distribution

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

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

<dependency>
  <groupId>org.glassfish.jaxb</groupId>
  <artifactId>jaxb-runtime</artifactId> <!--jaxb runtime-->
</dependency>

<dependency>
  <groupId>org.glassfish.jaxb</groupId>
  <artifactId>jaxb-xjc</artifactId> <!--java generation-->
</dependency>

<dependency>
  <groupId>org.glassfish.jaxb</groupId>
  <artifactId>jaxb-jxc</artifactId> <!--schema generation-->
</dependency>

如果直接使用jaxb-ri中的schemagen下载,请注意schemagen.bat中的JAXB_PATHmod中的目录不一致jaxb-ri.zip 文件。

例如使用 schemagen.bat:

  • 截至目前,从 https://maven.java.net/content/repositories/releases/com/sun/xml/bind/jaxb-ri/2.3.1/ 下载 jaxb-ri-2.3.1.zip(2.4.0-beta 也缺少 mod/javax.activation-api.jar

  • 使用这些步骤 运行 schemagen.bat,适当设置 JAXB_HOME:

         set JAXB_HOME=C:\Java\jaxb-ri-2.3.1
         set CLASSPATH=%JAXB_HOME%/mod/relaxng-datatype.jar;%JAXB_HOME%/mod/javax.activation-api.jar
         %JAXB_HOME%\bin\schemagen.bat -cp myjar1.jar;myjar2.jar -d target com.company.ClassName1 com.company.ClassName2
    

(这违背了JDK11)