【问题标题】:How do you invoke schemagen in Java 11?如何在 Java 11 中调用 schemagen?
【发布时间】:2018-12-31 06:43:27
【问题描述】:

根据 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 repo 中的构建说明表明它是使用标准“mvn clean install”构建的,但是不会产生与此处文档中使用的“bin”文件夹匹配的输出结构:https://javaee.github.io/jaxb-v2/doc/user-guide/ch04.html#tools-schemagen

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

我目前的尝试,改编自一个名为旧 schemagen.exe 的工作版本,如下所示:

(“真正的”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

【问题讨论】:

    标签: java gradle jaxb2 schemagen java-11


    【解决方案1】:

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

    您可以在评论后resolve this -

    请尝试 2.4.0-b180725.0644 - 这是 JPMS 模块化 RI 正在开发的 带有 java.xml.bind 模块的 JDK (9,10) 和没有它的 (11-ea)

    try downloading来自同一链接的二进制分发。

    【讨论】:

      【解决方案2】:

      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 并声明模块描述符。你可以试试 beta 版本(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>
      

      【讨论】:

      • 感谢您的回答。这确实是问题(模块路径上的 2.3.0)。我确实查看了 Gradle 插件,而我发现的唯一插件(记录在案的)包装了 xic 工具,但没有包装 jxc ......即不支持 schemagen。我的代码使用 2.4.0 beta。
      【解决方案3】:

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

      例如使用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
        

      (这是针对 JDK 11)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-04
        • 2011-05-18
        • 1970-01-01
        • 1970-01-01
        • 2015-12-31
        • 2021-07-31
        相关资源
        最近更新 更多