提问人:Philipp Kemkes 提问时间:5/31/2023 更新时间:11/13/2023 访问量:576
在 JAXB 中使用 jakarta 依赖项创建 Java 代码时,有没有办法生成值构造函数?
Is there a way to generate value constructors when creating Java code using jakarta dependencies in JAXB?
问:
我正在将我的 JAXB 代码从 javax.* 迁移到 jakarta.* 依赖项。到目前为止,我使用以下 maven 插件来生成 Java 代码。
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb23-plugin</artifactId>
<version>0.15.2</version>
<executions>
<execution>
...
<configuration>
...
<args>
<arg>-Xvalue-constructor</arg>
</args>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-value-constructor</artifactId>
<version>3.0</version>
</dependency>
</dependencies>
</plugin>
当然,这个 maven 插件使用 javax 依赖项创建代码。
有一个已更新到 jakarta 的分叉:
<groupId>com.helger.maven</groupId>
<artifactId>jaxb40-maven-plugin</artifactId>
但是我还没有找到生成值构造函数(jaxb2-value-constructor)的插件的更新版本。
有没有另一种方法可以从 XSD 文件生成 Java 代码,以便生成的代码使用新的 Jakarta 依赖项并包含一个简单的默认构造函数和一个值构造函数(一个接受所有类字段作为参数的构造函数)?
答:
不确定(未来),但实际的 xjc-plugin/fuctionality (jaxb2-value-constructor) 似乎与 jaxb-version-无关。org.jvnet.jaxb2.maven2
我可以管理(最新的雅加达.xml和:
Apache 的 cxf-xjc-plugin
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>xjc-demo-shiporder</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-xjc-plugin</artifactId>
<version>4.0.0</version> <!-- resp. latest -->
<executions>
<execution>
<id>cxf-xjc</id>
<phase>generate-sources</phase>
<goals>
<goal>xsdtojava</goal>
</goals>
<configuration>
<sourceRoot>${basedir}/target/generated-sources/jaxb</sourceRoot>
<extensions>
<extension>org.jvnet.jaxb2_commons:jaxb2-value-constructor:3.0</extension>
</extensions>
<xsdOptions>
<xsdOption>
<xsd>/src/main/xsd/shiporder.xsd</xsd>
<packagename>com.example.cxf.shiporder</packagename>
<extensionArgs>
<extensionArg>-Xvalue-constructor</extensionArg>
</extensionArgs>
</xsdOption>
</xsdOptions>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>4.0.0</version>
</dependency>
</dependencies>
</project>
...基本上是快速入门,只有“扩展”:+ 。<extensions/>
<extensionsArgs>
...但也具有:
法典Mojohaus 的 jaxb2-maven-plugin
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>3.1.0</version> <!-- resp. latest -->
<executions>
<execution>
<id>codehaus-xjc</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<arguments>
<argument>-Xvalue-constructor</argument>
</arguments>
<packageName>com.example.codehaus.shiporder</packageName>
</configuration>
<dependencies>
<dependency>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-value-constructor</artifactId>
<version>3.0</version> <!-- final/archived -->
</dependency>
</dependencies>
</plugin>
..使用相同的“Pom Skeletton”。
现在我们有了“xsd2java”生成:
- 最新的 XML API 和
- “no+all-args-constructors”。
我不建议在一个项目中混合使用这两个插件。
生成的源是相同的(不考虑包和时间戳),因为由具有等效输入的相同 (jdk) 工具生成。
(使用的 XSD:https://gist.github.com/xerx593/76e449c599307a48a5264aa746651ec8)
是的,有一种方法可以从 XSD 文件生成 Java 代码,以便生成的代码使用新的 Jakarta 依赖项,并包含一个简单的默认构造函数和一个值构造函数(接受所有类字段作为参数的构造函数)。
版本 2.1.1 从 XSD 文件生成 Jakarta JAXB 类,并使用附加组件扩展 XJC。hisrc-higherjaxb-maven-plugin
hisrc-basicjaxb-plugins
valueConstructor
POM 配置示例
...
<!-- mvn hisrc-higherjaxb:help -Ddetail=true -->
<!-- mvn hisrc-higherjaxb:generate -->
<plugin>
<groupId>org.patrodyne.jvnet</groupId>
<artifactId>hisrc-higherjaxb-maven-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<extension>true</extension>
<debug>true</debug>
<args>
<arg>-XvalueConstructor</arg>
</args>
<plugins>
<plugin>
<groupId>org.patrodyne.jvnet</groupId>
<artifactId>hisrc-basicjaxb-plugins</artifactId>
<version>2.1.1</version>
</plugin>
</plugins>
</configuration>
</plugin>
...
我知道这个问题现在已经很老了,但我想注意到您使用的插件现在能够生成有关最新 JAXB API 版本(以 v3 开头的命名空间)的 Java 代码jakarta
我们进行了一些重构,因此如果需要,请阅读迁移指南。
这将导致以下配置:
<plugin>
<groupId>org.jvnet.jaxb</groupId>
<artifactId>jaxb-maven-plugin</artifactId>
<version>4.0.0</version>
<executions>
<execution>
...
<configuration>
...
<args>
<arg>-Xvalue-constructor</arg>
</args>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.jvnet.jaxb</groupId>
<artifactId>jaxb-plugins</artifactId>
<version>4.0.0</version>
</dependency>
</dependencies>
</plugin>
注意:我们确实在以前的 jaxb2-basics 扩展(现在工件被命名为)中集成了 5 个 basic 之外的插件,您可以在这里找到这些插件,包括 .org.jvnet.jaxb:jaxb-plugins
jaxb2-value-constructor
评论