在 JAXB 中使用 jakarta 依赖项创建 Java 代码时,有没有办法生成值构造函数?

Is there a way to generate value constructors when creating Java code using jakarta dependencies in JAXB?

提问人:Philipp Kemkes 提问时间:5/31/2023 更新时间:11/13/2023 访问量:576

问:

我正在将我的 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 依赖项并包含一个简单的默认构造函数和一个值构造函数(一个接受所有类字段作为参数的构造函数)?

java maven-jaxb2-plugin jaxb2-basics

评论


答:

3赞 xerx593 5/31/2023 #1

不确定(未来),但实际的 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)

0赞 Rick O'Sullivan 8/28/2023 #2

是的,有一种方法可以从 XSD 文件生成 Java 代码,以便生成的代码使用新的 Jakarta 依赖项,并包含一个简单的默认构造函数和一个值构造函数(接受所有类字段作为参数的构造函数)。

版本 2.1.1 从 XSD 文件生成 Jakarta JAXB 类,并使用附加组件扩展 XJC。hisrc-higherjaxb-maven-pluginhisrc-basicjaxb-pluginsvalueConstructor

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>
...
0赞 Laurent Schoelens 11/13/2023 #3

我知道这个问题现在已经很老了,但我想注意到您使用的插件现在能够生成有关最新 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-pluginsjaxb2-value-constructor