6

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

然而,缺少的是如何调用这些工具。在 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
4

3 回答 3

3

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

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

请尝试2​​.4.0-b180725.0644 - 这是 JPMS 模块化 RI,适用于带有 java.xml.bind 模块 (9,10) 和没有它 (11-ea) 的 JDK

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

于 2018-07-24T15:15:31.833 回答
2

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

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

您尝试com.sun.tools.jxc.SchemaGeneratorFacade手动调用也是正确的,这里是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>
于 2018-07-27T15:11:24.573 回答
0

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

例如使用schemagen.bat

  • 截至目前,jaxb-ri-2.3.1.ziphttps://maven.java.net/content/repositories/releases/com/sun/xml/bind/jaxb-ri/2.3.1/下载(2.4.0-betas 也有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 的)

于 2020-08-10T09:16:41.663 回答