maven-jaxb2-plugin 失败,必须存在 JAXB 版本属性
maven-jaxb2-plugin fails with JAXB version attribute must be present
我对 maven-jaxb2-plugin
进行了以下配置:
<!-- https://mvnrepository.com/artifact/org.jvnet.jaxb2.maven2/maven-jaxb2-plugin -->
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.13.2</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<strict>false</strict>
<schemaLanguage>WSDL</schemaLanguage>
<generatePackage>com.mycompany.project.domain.wsdl</generatePackage>
<schemas>
<schema>
<url>url or file</url>
</schema>
</schemas>
</configuration>
</plugin>
它失败了:
[ERROR] Error while parsing schema(s).Location [ file:/home/hasancansaral/workspace/company/domain/src/main/xsd/delivery.wsdl{2,366}].
org.xml.sax.SAXParseException; systemId: 文件:/home/hasancansaral/workspace/company/domain/src/main/xsd/delivery.wsdl;行号:2;列数:366; JAXB 版本属性必须存在
如果我通过 IntelliJ IDEA 运行 插件或做一个简单的 mvn clean jax2b:generate
都没有区别。但是,该操作是成功的,可以找到 here 的模式,所以我怀疑我的 wsdl 模式实际上是格式错误的,我暂时无法 public,但可以通过消息提供(我知道这对 public 没有多大帮助,但如果问题出在架构中,我将 post 此处的相关问题部分)。
注:
SOAP UI 也验证架构。
注2:
jax2b-maven-plugin
和 maven-jax2b-plugin
.
都存在相同的错误
TL;DR 您的 WSDL 不是 XJC 的 correct/suitable。您将需要 strup JAXB 自定义或将 xmlns:jxb="http://java.sun.com/xml/ns/jaxb" jxb:version="2.1"
添加到根元素。
问题是您的 WSDL 在包含的模式中包含大量 JAXB 自定义项。这是一个坏主意。 JAXB 定制是特定于供应商的东西,无论是谁将它们放在 WSDL(应该是供应商中立的规范)中都没有做正确的事情。
现在的问题是,当您具有内联 JAXB 自定义时,XJC、JAXB 模式编译需要一些额外的功能。就像根元素上的 jaxb:version
属性。在这种情况下,这是缺失的。它出现在 schema
元素上,但不出现在根 wsdl:definitions
元素上。如果你add it,编译成功
这与 JAXB 插件无关。如果你尝试 xjc -wsdl delivery.wsdl
,你会得到同样的错误。
可能有一些神奇的选项可以抑制这个问题,但很难弄清楚。所以我建议修补 WSDL。创建补丁并在预代码生成步骤中将其应用到 WSDL。我个人会从 WSDL 中删除所有 JAXB 定制,因为它们几乎什么都没有忘记。
我对 maven-jaxb2-plugin
进行了以下配置:
<!-- https://mvnrepository.com/artifact/org.jvnet.jaxb2.maven2/maven-jaxb2-plugin -->
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.13.2</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<strict>false</strict>
<schemaLanguage>WSDL</schemaLanguage>
<generatePackage>com.mycompany.project.domain.wsdl</generatePackage>
<schemas>
<schema>
<url>url or file</url>
</schema>
</schemas>
</configuration>
</plugin>
它失败了:
[ERROR] Error while parsing schema(s).Location [ file:/home/hasancansaral/workspace/company/domain/src/main/xsd/delivery.wsdl{2,366}].
org.xml.sax.SAXParseException; systemId: 文件:/home/hasancansaral/workspace/company/domain/src/main/xsd/delivery.wsdl;行号:2;列数:366; JAXB 版本属性必须存在
如果我通过 IntelliJ IDEA 运行 插件或做一个简单的 mvn clean jax2b:generate
都没有区别。但是,该操作是成功的,可以找到 here 的模式,所以我怀疑我的 wsdl 模式实际上是格式错误的,我暂时无法 public,但可以通过消息提供(我知道这对 public 没有多大帮助,但如果问题出在架构中,我将 post 此处的相关问题部分)。
注: SOAP UI 也验证架构。
注2:
jax2b-maven-plugin
和 maven-jax2b-plugin
.
TL;DR 您的 WSDL 不是 XJC 的 correct/suitable。您将需要 strup JAXB 自定义或将 xmlns:jxb="http://java.sun.com/xml/ns/jaxb" jxb:version="2.1"
添加到根元素。
问题是您的 WSDL 在包含的模式中包含大量 JAXB 自定义项。这是一个坏主意。 JAXB 定制是特定于供应商的东西,无论是谁将它们放在 WSDL(应该是供应商中立的规范)中都没有做正确的事情。
现在的问题是,当您具有内联 JAXB 自定义时,XJC、JAXB 模式编译需要一些额外的功能。就像根元素上的 jaxb:version
属性。在这种情况下,这是缺失的。它出现在 schema
元素上,但不出现在根 wsdl:definitions
元素上。如果你add it,编译成功
这与 JAXB 插件无关。如果你尝试 xjc -wsdl delivery.wsdl
,你会得到同样的错误。
可能有一些神奇的选项可以抑制这个问题,但很难弄清楚。所以我建议修补 WSDL。创建补丁并在预代码生成步骤中将其应用到 WSDL。我个人会从 WSDL 中删除所有 JAXB 定制,因为它们几乎什么都没有忘记。