根据Oracle文档,作为JEP 320 (http://openjdk.java.net/jeps/320)的一部分,模式工具将从JDK中删除。JEP指向Maven工件,这些工件现在提供了缺少的工具。工件的坐标在JEP中是错误的,更新的坐标可以在以下问题的答案中找到:在Maven项目中,我应该为JAXB使用哪些工件?
然而,缺少的是如何调用这些工具。JEP中指向的shell脚本位于JAXB存储库中。然而,这些脚本仍然没有文档化,很难调用。git中的构建说明表明它是用标准的"mvn干净安装“构建的,但是这不会产生与文档中使用的'bin‘文件夹相匹配的输出结构:https://javaee.github.io/jaxb-v2/doc/user-guide/ch04.html#tools-schemagen。
理想情况下,我希望从Gradle运行模式,避免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发布于 2018-07-24 15:15:31
jaxb-*:2.3.0版本的https://github.com/javaee/jaxb-v2/issues/1168似乎已经知道了这个问题。此外,这将通过运行在java-9上的jaxb的已知问题中标记的未来版本来解决。
你可以在评论后解决这个问题 -
请尝试2.4.0-b180725.0644 -这是JPMS模块化的RI在JDK上使用java.xml.bind模块(9,10)和那些没有它的(11-ea)
或者从同一个链接中试着下载二进制分布。
发布于 2018-07-27 15:11:24
Schemagen和xjc脚本仅放在./bin目录中的二元分布中。
对于构建工具,有一些插件(Maven / Gradle)可以调用模式和xjc,为用户提供简单的配置。
手动调用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>发布于 2020-08-10 09:16:41
如果试图直接使用jaxb-ri下载中的schemagen,请注意schemagen.bat中的JAXB_PATH与jaxb-ri.zip文件中的mod目录不一致。
例如使用schemagen.bat
jaxb-ri-2.3.1.zip下载https://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 -d com.company.ClassName1 com.company.ClassName2(这是针对JDK 11的)
https://stackoverflow.com/questions/51485137
复制相似问题