我希望通过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" />
插件
答案 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 schema(xacml-core-v3-schema-wd-17.xsd
)导入W3C标准XML命名空间模式(xml.xsd
)。因此,您有一个Maven project/artifact for the xml.xsd和another 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
,因此最好保持它与原始模式一样。)