我想从我的Java项目调用ISAN Restful API,所以我尝试使用maven-jaxb2-plugin从xsd文件生成java bean。 这是xsds:
我下载了这些文件并将它们复制到我的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>
现在插件告诉我一些类型被定义了多次。例如:
03/11/2016 16:42:53 UTC + 1:[错误]解析架构时出错。位置[文件:/ 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>
我仍然遇到同样的错误
答案 0 :(得分:2)
你遇到了这个错误:
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。
以下是您可以检查此类设置的几个项目:
检查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>