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_PATH
与mod
中的目录不一致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)
根据 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_PATH
与mod
中的目录不一致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)