如何创建常见的xsd生成的java类

时间:2018-02-23 11:59:26

标签: xsd maven-jaxb2-plugin

我希望通过java生成XSDs个类,我想在另一个XSD中使用/包含一个XSDs文件,但是当我将它们包含在另一个java相同的maven-jaxb2-plugin中时1}}在两个包中生成类。我也在使用<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 插件

1 个答案:

答案 0 :(得分:2)

使用所谓的剧集进行separate - aka modular - schema compilation。也就是说,如果要将模式A导入模式B并为模式B生成类,首先要创建一个单独的Maven项目,以便像往常一样使用maven-jaxb2-plugin将模式A编译为单独的Maven工件。 (这假设模式A是独立的,即不导入任何其他模式;否则您必须在导入的模式上重复相同的过程。)因此,您将获得生成的类仅来自架构A ,最重要的是,META-INF/sun-jaxb.episode文件。此文件提供有关现有XSD-to-Java绑定的信息,这将告诉maven-jaxb2-plugin(实际上是基于maven-jaxb2-plugin的xjc工具)已从模式生成的内容,因此可以防止它再次重新生成相同的类。

然后,您创建另一个Maven项目,以便在其Maven依赖项中使用A.jar的maven工件来编译模式B.这次,在maven-jaxb2-plugin的配置中,将配置参数useDependenciesAsEpisodes设置为true。这将告诉插件使用来自所有依赖项的.episode文件(如果有的话)。您可以在插件的GitHub wiki上找到一个基本示例。下面是来自AuthzForce项目(XACML实现)的实际示例,其中OASIS XACML standard schemaxacml-core-v3-schema-wd-17.xsd)导入W3C标准XML命名空间模式(xml.xsd)。因此,您有一个Maven project/artifact for the xml.xsdanother one for the XACML schema,其中POM的相关部分如下所示:

<project ...>
  ...
  <dependencies>
    ...
    <dependency>
        <groupId>${project.groupId}</groupId>
        <artifactId>${artifactId.prefix}-xmlns-model</artifactId>
        <version>${project.parent.version}</version>
    </dependency>
    ...
  </dependencies>
  <build>
    <plugins>
        ...
        <plugin>
            <groupId>org.jvnet.jaxb2.maven2</groupId>
            <artifactId>maven-jaxb2-plugin</artifactId>
            <configuration>
                <verbose>true</verbose>
                <extension>true</extension>
                <strict>false</strict>
                <useDependenciesAsEpisodes>true</useDependenciesAsEpisodes>
                ...
                <catalog>src/main/jaxb/catalog.xml</catalog>
                <schemaDirectory>src/main/resources</schemaDirectory>
                <schemaIncludes>
                    <include>xacml-core-v3-schema-wd-17.xsd</include>
                </schemaIncludes>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
  </build>
</project>

您注意到还有一个指向XML目录文件的catalog参数。这也很重要,因为此目录将使插件能够直接在其maven工件中找到A.xsd文件(在我的示例中为xml.xsd),这样您就不需要在项目B或其他地方复制该文件。在我的示例中,由于XACML模式导入xml.xsd,如下所示:

<xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/>

...... catalog.xml必须如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
  <system systemId="http://www.w3.org/2001/xml.xsd" uri="maven:org.ow2.authzforce:authzforce-ce-xmlns-model:jar!/xml.xsd" />
</catalog>

您注意到uri参数从其Maven工件引用xml.xsd。有关此语法的更多信息以引用Maven工件资源,请参阅maven-jaxb2-plugin's wiki

通常,为了在管理模式位置时提供最大的灵活性和简单性,我建议仅在模式导入中指定名称空间。 (否schemaLocation。)例如,更喜欢这个:

<xs:import namespace="http://www.w3.org/XML/1998/namespace" />

...在这种情况下,catalog.xml应如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
  <public publicId="http://www.w3.org/XML/1998/namespace" uri="maven:org.ow2.authzforce:authzforce-ce-xmlns-model:jar!/xml.xsd" />
</catalog>

(在我的例子中,情况并非如此,因为标准委员会的官方XACML模式使用了schemaLocation,因此最好保持它与原始模式一样。)