使用 OpenJDK 11 运行 JAXB xjc 编译器

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(496)   2023-06-26 07:54:18

正如“要从 Java 11 中删除的 API”一文中所述,JAXB 实现不再包含在 JDK 11 中。在这篇文章中,我着眼于使用随 JAXBXML 绑定的 Java 体系结构)提供的xjc 编译器参考实现 结合 OpenJDK 11XML 模式 文件编译成 Java 类。

Java SE 6 之前,想要将 JAXB 与 Java SE 应用程序一起使用的开发人员需要单独获取 JAXB 实现,因为 Java 分发版未提供 JAXB 实现。 JAXB 实现从 Java SE 6 开始包含在 Java 中。这在许多情况下很方便,但当开发人员希望使用 JAXB 的新版本或不同实现而不是随 JDK 提供的实现时,这会使事情有点困难。当 OpenJDK 9 引入模块化时,JAXB 实现被移动java.xml.bind 模块 并被标记为 已弃用 用于删除JAXB 实现与 JDK 11 一起删除。这篇博文探讨了将 JAXB 的 xjc 编译器OpenJDK 11 结合使用。

因为 JDK 11 不再包含 JAXB 的实现,所以必须单独获取一个。对于这篇文章,我将使用JAXB 参考实现2.3.0 版。本文中使用的 JDK 版本是 JDK 11.0.2 General-Availability Release

运行不带参数的 xjc 脚本会导致帮助/用法被呈现到标准输出。

Usage: xjc [-options ...] <schema file/URL/dir/jar> ... [-b <bindinfo>] ...
If dir is specified, all schema files in it will be compiled.
If jar is specified, /META-INF/sun-jaxb.episode binding file will be compiled.
Options:
  -nv                :  do not perform strict validation of the input schema(s)
  -extension         :  allow vendor extensions - do not strictly follow the
                        Compatibility Rules and App E.2 from the JAXB Spec
  -b <file/dir>      :  specify external bindings files (each <file> must have its own -b)
                        If a directory is given, **/*.xjb is searched
  -d <dir>           :  generated files will go into this directory
  -p <pkg>           :  specifies the target package
  -m <name>          :  generate module-info.java with given Java module name
  -httpproxy <proxy> :  set HTTP/HTTPS proxy. Format is [user[:password]@]proxyHost:proxyPort
  -httpproxyfile <f> :  Works like -httpproxy but takes the argument in a file to protect password 
  -classpath <arg>   :  specify where to find user class files
  -catalog <file>    :  specify catalog files to resolve external entity references
                        support TR9401, XCatalog, and OASIS XML Catalog format.
  -readOnly          :  generated files will be in read-only mode
  -npa               :  suppress generation of package level annotations (**/package-info.java)
  -no-header         :  suppress generation of a file header with timestamp
  -target (2.0|2.1)  :  behave like XJC 2.0 or 2.1 and generate code that doesnt use any 2.2 features.
  -encoding <encoding> :  specify character encoding for generated source files
  -enableIntrospection :  enable correct generation of Boolean getters/setters to enable Bean Introspection apis 
  -disableXmlSecurity  :  disables XML security features when parsing XML documents 
  -contentForWildcard  :  generates content property for types with multiple xs:any derived elements 
  -xmlschema         :  treat input as W3C XML Schema (default)
  -dtd               :  treat input as XML DTD (experimental,unsupported)
  -wsdl              :  treat input as WSDL and compile schemas inside it (experimental,unsupported)
  -verbose           :  be extra verbose
  -quiet             :  suppress compiler output
  -help              :  display this help message
  -version           :  display version information
  -fullversion       :  display full version information


Extensions:
  -Xinject-code      :  inject specified Java code fragments into the generated code
  -Xlocator          :  enable source location support for generated code
  -Xsync-methods     :  generate accessor methods with the 'synchronized' keyword
  -mark-generated    :  mark the generated code as @javax.annotation.Generated
  -episode <FILE>    :  generate the episode file for separate compilation
  -Xpropertyaccessors :  Use XmlAccessType PROPERTY instead of FIELD for generated classes

xjc 编译器脚本(bash 文件和 DOS 批处理文件)方便调用 jaxb-xjc.jar。脚本将其作为 可执行 JAR (java -jar) 调用,如以下摘录所示:

  • Windows 版本 (xjc.bat):%JAVA% %XJC_OPTS% -jar "%JAXB_HOME%\lib\jaxb-xjc.jar" %*
  • Linux 版本 (xjc.sh):exec "$JAVA" $XJC_OPTS -jar "$JAXB_HOME/lib/jaxb-xjc.jar" "$@"

如上面的脚本摘录所示,环境变量 XJC_OPTS 包含在 Java 启动器的调用中。不幸的是,JAXB 参考实现 JAR 不能通过 -classpath 简单地添加到类路径中,因为使用 java -jarrunning excutable JARs 只尊重在通过 MANIFEST.MFClass-Path 执行 JAR(jaxb-ri-2.3.0.jar 中的条目作为“Class-Path: jaxb-core.jar jaxb-impl.jar”)。

解决这个问题的一种方法是修改脚本以将 JAR 用作常规 JAR(没有 -jar)并显式执行类 XJCFacade,这样类路径就可以显式提供给 Java 启动器。这是为 Windows xjc.bat 脚本演示的:

%JAVA% -cp C:\lib\javax.activation-api-1.2.0.jar;C:\jaxb-ri-2.3.0\lib\jaxb-xjc.jar com.sun.tools.xjc.XJCFacade %*

除了 JAXB 参考实现 JAR javax.activation-api-1.2.0.jar,我还需要在类路径中包含 javax.activation-api-1.2.0.jar JAR,因为 JavaBeans Application Framework (JAF) 是一个不再随 JDK 一起提供的依赖项(通过删除 JAXB 的相同 JEP 320 删除)。

当然,也可以完全不使用 XJC 脚本并直接运行 Java 启动器。该脚本确保环境变量 JAXB_HOME 已设置。此环境变量应指向 JAXB 参考实现扩展到的目录。

通过这些更改,可以使用 JDK 11 在命令行上针对 XSD 执行 JAXB xjc 编译器。

标签2: Java教程
地址:https://www.cundage.com/article/jcg-running-jaxb-xjc-compiler-with-openjdk-11.html

相关阅读

Java HashSet 教程展示了如何使用 Java HashSet 集合。 Java哈希集 HashSet 是一个不包含重复元素的集合。此类为基本操作(添加、删除、包含和大小)提供恒定时间性...
SpringApplicationBuilder 教程展示了如何使用 SpringApplicationBuilder 创建一个简单的 Spring Boot 应用程序。 春天 是用于创建企业应...
通道是继 buffers 之后 java.nio 的第二个主要新增内容,我们在之前的教程中已经详细了解了这一点。通道提供与 I/O 服务的直接连接。 通道是一种在字节缓冲区和通道另一端的实体(通...
课程大纲 Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了一个分布式的、支持多租户的全文搜索引擎,带有 HTTP Web 界面和无模式的 JSON 文档。 Elasti...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Java 是用于开发各种桌面应用程序、Web 应用程序和移动应用程序的最流行的编程语言之一。以下文章将帮助您快速熟悉 Java 语言,并迈向 API 和云开发等更复杂的概念。 1. Java语言...
Java中的继承是指子类继承或获取父类的所有非私有属性和行为的能力。继承是面向对象编程的四大支柱之一,用于提高层次结构中类之间的代码可重用性。 在本教程中,我们将了解 Java 支持的继承类型,...
Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。 JMS 提...
之前,我介绍了spring 3 + hibernate 集成 示例和struts 2 hello world 示例。在本教程中,我将讨论在将 spring 框架与 struts 与 hibern...
Java 项目中的一项常见任务是将日期格式化或解析为字符串,反之亦然。解析日期意味着你有一个代表日期的字符串,例如“2017-08-3”,你想把它转换成一个代表 Java 中日期的对象,例如Ja...