jaxb2-maven-plugin 使用 xmlns 前缀生成 package-info.java

raz*_*e92 5 java jaxb xjc maven jaxb2-maven-plugin

我想用 jaxb2-maven-plugin 生成 java 类。我正在使用以下配置:

pom.xml:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxb2-maven-plugin</artifactId>
    <version>2.5.0</version>
    <executions>
        <execution>
            <id>SomeID</id>
            <goals>
                <goal>xjc</goal>
            </goals>
            <configuration>
                <extension>true</extension>
                <clearOutputDir>true</clearOutputDir>
                <sources>
                    <source>src/main/xsd/schema.xsd</source>
                </sources>
                <noGeneratedHeaderComments>true</noGeneratedHeaderComments>
            </configuration>
        </execution>
    </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

架构.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://my.target.namespace/uri" 
    xmlns="http://my.target.namespace/uri" 
    elementFormDefault="qualified"
    attributeFormDefault="unqualified"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:h="http://my.uri.for.prefix.h"
    xmlns:f="http://my.target.namespace/uri">
    
    <xsd:import namespace="http://my.uri.for.prefix.h" schemaLocation="schema2.xsd"/> 
    
    <xsd:complexType name="FooType">
        <xsd:sequence>
            <xsd:element ref="h:something" minOccurs="0" maxOccurs="1"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:element name="FooType" type="FooType" />
 
</xsd:schema>
Run Code Online (Sandbox Code Playgroud)

Jaxb2 插件正在为我生成以下package-info.java

@javax.xml.bind.annotation.XmlSchema(namespace = "http://my.target.namespace/uri", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package ...;
Run Code Online (Sandbox Code Playgroud)

但是,我想得到的是:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://my.target.namespace/uri", xmlns = {
        @XmlNs(prefix="f", namespaceURI="http://my.target.namespace/uri"),
        @XmlNs(prefix="h", namespaceURI="http://my.uri.for.prefix.h")
}, elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package ...;

import javax.xml.bind.annotation.XmlNs;
Run Code Online (Sandbox Code Playgroud)

我生成的文件中缺少前缀。怎么做?我已经尝试创建一个绑定文件,但这并没有像我预期的那样工作。

veg*_*4me 3

有关如何解决此问题的信息,请参阅此答案: /sf/answers/756856551/

答案写得很好并且很容易理解。基本上你必须:

  1. 放弃jaxb2-maven-plugin支持maven-jaxb2-plugin.
  2. 包含jaxb2-namespace-prefix依赖项并提供<arg>-Xnamespace-prefix</arg>.
  3. 编写一个bindings.xml只有几行长的新文件。

package-info.java您的 POM 文件将变得更加冗长,但按照您需要的方式生成是值得的。

作为奖励,还有大量与maven-jaxb2-plugin提供额外功能相关的附加插件和依赖项。我发现有用的一点是jaxb2-rich-contract-plugin它能够生成生成器并使生成的类不可变*。

*严格来说,并不是不可变的(因为它只是将 setter 方法更改为包私有),但足以让他们感觉更安全。