为何Maven namespace-prefix插件无法为package-info.java配置多命名空间前缀?
问题原因及解决方案
原因
urn:jaxb.jvnet.org:plugin:namespace-prefix插件的<namespace:prefix>配置逻辑是:仅将与当前绑定目标(schema/package)直接关联的命名空间前缀写入package-info.java。
你当前的绑定配置针对OrderStateService-v1.0.xsd,但soapenv、v1p0、v1p1对应的命名空间并未在该schema中被引用(比如没有通过<xs:import>/<xs:include>声明,也没有在schema的元素/类型中使用这些命名空间),因此插件只会处理与该schema直接相关的第一个命名空间前缀,其余未关联的前缀会被忽略。
解决方案
方案1:在目标schema中显式引用所需命名空间
如果这些命名空间确实需要和当前package关联,先在OrderStateService-v1.0.xsd中添加对应命名空间的引用声明,示例:
<xs:import namespace="http://schemas.xmlsoap.org/soap/envelope/" schemaLocation="soap-envelope.xsd"/> <xs:import namespace="http://types.theberlinbakery.com/v1_0" schemaLocation="types-v1.0.xsd"/> <xs:import namespace="http://types.theberlinbakery.com/v1_1" schemaLocation="types-v1.1.xsd"/>
之后原绑定配置即可生效,插件会将所有被schema引用的命名空间前缀写入package-info.java。
方案2:直接针对package配置前缀
如果某些命名空间不需要在schema中引用,但仍需写入package-info,可修改绑定配置,直接针对目标package进行配置,而非单个schema:
<bindings packageName="com.intershop.iom.typesv1_2"> <namespace:prefix name="" namespaceURI="http://types.theberlinbakery.com/v1_2" /> <namespace:prefix name="soapenv" namespaceURI="http://schemas.xmlsoap.org/soap/envelope/" /> <namespace:prefix name="v1p0" namespaceURI="http://types.theberlinbakery.com/v1_0" /> <namespace:prefix name="v1p1" namespaceURI="http://types.theberlinbakery.com/v1_1" /> </bindings>
这种方式会强制将所有配置的前缀注入到指定package的package-info.java中。
内容的提问来源于stack exchange,提问作者gkephorus
相关产品推荐
相关产品推荐

