Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建常见的xsd生成的java类_Xsd_Maven Jaxb2 Plugin - Fatal编程技术网

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

如何创建常见的xsd生成的java类,xsd,maven-jaxb2-plugin,Xsd,Maven Jaxb2 Plugin,我想通过XSDs生成java类,我想在另一个XSD文件中使用/包含一个XSD文件,但当我在另一个XSDs中包含它们时,两个包中都会生成相同的java类。我还使用了maven-jaxb2-pluginplugin使用所谓的剧集。也就是说,如果您想将模式A导入模式B并为模式B生成类,那么首先创建一个单独的Maven项目,以便像往常一样使用Maven-jaxb2-plugin将模式A编译为单独的Maven工件。(这是假设模式A是独立的,即不导入任何其他模式;否则您必须在导入的模式上重复相同的过程。)因

我想通过
XSDs
生成
java
类,我想在另一个
XSD
文件中使用/包含一个
XSD
文件,但当我在另一个
XSDs
中包含它们时,两个包中都会生成相同的
java
类。我还使用了
maven-jaxb2-plugin
plugin

使用所谓的剧集。也就是说,如果您想将模式A导入模式B并为模式B生成类,那么首先创建一个单独的Maven项目,以便像往常一样使用Maven-jaxb2-plugin将模式A编译为单独的Maven工件。(这是假设模式A是独立的,即不导入任何其他模式;否则您必须在导入的模式上重复相同的过程。)因此,您只能从模式A获得一个包含生成类的.jar,最重要的是,一个文件。该文件提供了关于现有XSD到Java绑定的信息,这将告诉maven-jaxb2-plugin(实际上是maven-jaxb2-plugin底层的xjc工具)已经从模式中生成了什么,从而防止它再次重新生成相同的类

然后创建另一个Maven项目以编译模式B,Maven依赖项中包含一个.jar的Maven工件。这次,在maven-jaxb2-plugin的配置中,您将配置参数
usedependenciesepisodes
设置为
true
。这将告诉插件使用来自所有依赖项的
.eposion
文件(如果有)。你可以在插件上找到一个基本的例子。下面是一个来自project的实际示例,一个XACML实现,其中OASIS(
XACML-core-v3-schema-wd-17.xsd
)导入W3C标准XML命名空间模式(
XML.xsd
)。因此,您有一个,并且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 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>
<?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>
您注意到,
uri
参数从其Maven工件中引用了
xml.xsd
。有关此语法的更多信息,请参阅Maven工件资源,请参阅

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

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

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

<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 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>
<?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模式使用了
模式位置,因此最好保持原样。)

使用所谓的片段。也就是说,如果您想将模式A导入模式B并为模式B生成类,那么首先创建一个单独的Maven项目,以便像往常一样使用Maven-jaxb2-plugin将模式A编译为单独的Maven工件。(这是假设模式A是独立的,即不导入任何其他模式;否则您必须在导入的模式上重复相同的过程。)因此,您只能从模式A
获得一个包含生成类的.jar,最重要的是,一个文件。该文件提供了关于现有XSD到Java绑定的信息,这将告诉maven-jaxb2-plugin(实际上是maven-jaxb2-plugin底层的xjc工具)已经从模式中生成了什么,从而防止它再次重新生成相同的类

然后创建另一个Maven项目以编译模式B,Maven依赖项中包含一个.jar的Maven工件。这次,在maven-jaxb2-plugin的配置中,您将配置参数
usedependenciesepisodes
设置为
true
。这将告诉插件使用来自所有依赖项的
.eposion
文件(如果有)。你可以在插件上找到一个基本的例子。下面是一个来自project的实际示例,一个XACML实现,其中OASIS(
XACML-core-v3-schema-wd-17.xsd
)导入W3C标准XML命名空间模式(
XML.xsd
)。因此,您有一个,并且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 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>
<?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>
您注意到,
uri
参数从其Maven工件中引用了
xml.xsd
。有关此语法的更多信息,请参阅Maven工件资源,请参阅

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

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

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

<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 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>
<?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模式使用了
模式定位
,因此最好保持原样。)