我想从我的Java项目中调用ISAN Restful API,所以我试图使用maven-jaxb2-plugin从xsd文件生成Java bean。
这是xsds:


http://www.isan.org/schema/v1.11/common/common.xsd
http://www.isan.org/schema/v1.21/common/serial.xsd
http://www.isan.org/schema/v1.11/common/version.xsd
http://www.isan.org/ISAN/isan.xsd
http://www.isan.org/schema/v1.11/common/title.xsd
http://www.isan.org/schema/v1.11/common/externalid.xsd
http://www.isan.org/schema/v1.11/common/participant.xsd
http://www.isan.org/schema/v1.11/common/language.xsd
http://www.isan.org/schema/v1.11/common/country.xsd


我下载了这些文件并将其复制到我的src / main / resources文件夹中。
这是我来自pom.xml的插件配置:

        <plugins>
        <plugin>
            <groupId>org.jvnet.jaxb2.maven2</groupId>
            <artifactId>maven-jaxb2-plugin</artifactId>
            <version>0.12.3</version>
            <configuration>
                <schemaDirectory>src/main/resources</schemaDirectory>
            </configuration>

            <executions>
                <execution>
                    <id>isan</id>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                    <configuration>
                        <generatePackage>org.isan</generatePackage>
                        <generateDirectory>${project.build.directory}/generated-sources/isan</generateDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>


现在,插件告诉我某些类型被多次定义。例如 :


  2016/03/11 16:42:53 UTC + 1:[ERROR]解析架构时出错。位置[文件:/ D:/isan/isan/src/main/resources/common.xsd {51,37 }]。 “ DurationType”已定义
  03/11/2016 16:42:53 UTC + 1:[ERROR]解析架构时出错。位置[http://www.isan.org/schema/v1.11/common/common.xsd {46,38}]。 (与上述错误有关)第一个定义出现在这里


我了解这是因为每种类型都在本地文件和远程文件中定义。一种解决方案似乎是使用目录(https://github.com/highsource/maven-jaxb2-plugin/wiki/Using-Catalogs),但似乎不起作用。

我在“ src / main / resources”中添加了此目录:

PUBLIC "http://www.isan.org/schema/v1.11/common/common.xsd" "./common.xsd"
PUBLIC "http://www.isan.org/schema/v1.11/common/country.xsd" "./country.xsd"
PUBLIC "http://www.isan.org/schema/v1.11/common/externalid.xsd" "./externalid.xsd"
PUBLIC "http://www.isan.org/schema/v1.11/common/isan.xsd" "./isan.xsd"
PUBLIC "http://www.isan.org/schema/v1.11/common/language.xsd" "./language.xsd"
PUBLIC "http://www.isan.org/schema/v1.11/common/participant.xsd" "./participant.xsd"
PUBLIC "http://www.isan.org/schema/v1.11/common/serial.xsd" "./serial.xsd"
PUBLIC "http://www.isan.org/schema/v1.11/common/title.xsd" "./title.xsd"
PUBLIC "http://www.isan.org/schema/v1.11/common/version.xsd" "./version.xsd"

REWRITE_SYSTEM "http://www.isan.org" "isan"


并修改了插件配置:

                <configuration>
                    <strict>false</strict>
                    <catalog>src/main/resources/catalog.cat</catalog>
                    <generatePackage>org.isan</generatePackage>
                    <generateDirectory>${project.build.directory}/generated-sources/isan</generateDirectory>
                </configuration>


我仍然遇到相同的错误

最佳答案

您遇到了这个错误:

https://github.com/javaee/jaxb-v2/issues/1045

问题是,当XJC使用目录文件时,它最终会将解析的URL与名称空间而不是原始名称空间相关联。这导致奇怪的错误,即同一类型被报告多次定义。

解决方案是使用目录(如您所做的那样),但编译绝对URL而不是本地文件。在这种情况下,您的所有架构都将具有原始URL。

因此,这是您的操作方式:

创建架构文件的本地副本。我发现最好在服务器上复制目录结构。因此,您将获得以下内容:

isan
  schema
    v1.11
      common
        common.xsd
        version.xsd
        title.xsd
        externalid.xsd
        participant.xsd
        language.xsd
        country.xsd
    v1.21
      common
        serial.xsd
  ISAN
    isan.xsd


编写目录文件以重写绝对URL:

REWRITE_SYSTEM "http://www.isan.org" "isan"


使用此目录并从绝对URL编译模式,例如:

<strict>false</strict>
<catalog>src/main/resources/catalog.cat</catalog>
<schemas>
    <schema>
        <url>http://www.isan.org/schema/v1.11/common/common.xsd</url>
    </schema>
    <schema>
        <url>http://www.isan.org/schema/v1.21/common/serial.xsd</url>
    </schema>
    <!-- ... -->
</schemas>


您可能只需要几个URL,因为架构可能会相互导入。

您可能会遇到的一个问题是,架构在xs:import中同时使用相对URL和绝对URL。相对URL将解析为本地URL,因此您会遇到相同的问题。在这种情况下,我必须修补架构以使所有架构仅使用绝对URL。

您可以检查以下几个项目来进行这种设置:


https://github.com/highsource/w3c-schemas
https://github.com/highsource/ogc-schemas


检查schemas模块以获取修补/准备好的模式。其他模块从绝对URL编译模式,但使用目录将绝对URL重写为此schemas模块中的资源。

这是目录文件:

REWRITE_SYSTEM "http://www.w3.org" "maven:org.hisrc.w3c:w3c-schemas:jar::!/w3c"


这是其中一个模块的pom.xml的摘录:

<schemas>
    <schema>
        <url>http://www.w3.org/2007/06/wsdl/wsdl20.xsd</url>
    </schema>
    <schema>
        <url>http://www.w3.org/2007/06/wsdl/http.xsd</url>
    </schema>
    <schema>
        <url>http://www.w3.org/2007/06/wsdl/rpc.xsd</url>
    </schema>
    <schema>
        <url>http://www.w3.org/2007/06/wsdl/soap.xsd</url>
    </schema>
    <schema>
        <url>http://www.w3.org/2007/06/wsdl/wsdl20-extensions.xsd</url>
    </schema>
    <schema>
        <url>http://www.w3.org/2007/06/wsdl/wsdl20-instance.xsd</url>
    </schema>
</schemas>

10-02 11:42