使用 maven jaxb2 插件,模块化编译使用 episode 和 catalog 抛出 Malformed URL 错误
Using maven jaxb2 plugin, modular compilation using episode and catalog throws Malformed URL error
我的项目包含 A.xsd,它从属于另一个项目的 B.xsd 导入如下架构:
<xsd:import namespace="http://com.test.schema/common/Context" schemaLocation="http://com.test.schema/common/Context/B.xsd"/>
我正在尝试使用包含 B.xsd 的项目中的剧集,以便在解析 A.xsd 时不会重新生成与 B.xsd 相关的 类 .所以我参考 this and this 提出以下配置:
这是 pom.xml
<dependencies>
<dependency>
<groupId>com.bar.foo</groupId>
<artifactId>schema-b</artifactId>
<version>1.2</version>
</dependency>
<dependencies>
.
.
.
.
.
<build>
<plugins>
<dependency>
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.13.0</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<extension>true</extension>
<episodes>
<episode>
<groupId>com.bar.foo</groupId>
<artifactId>schema-b</artifactId>
</episode>
</episodes>
<catalog>src/main/resources/catalog.cat</catalog>
<schemas>
<schema>
<fileset>
<directory>${basedir}/src/main/schemas</directory>
<includes>
<include>A.xsd</include>
<include>...</include>
<include>...</include>
</includes>
</fileset>
</schema>
</schemas>
<bindingDirectory>${basedir}/src/main/schemas</bindingDirectory>
<bindingIncludes>
<include>*.xjb</include>
</bindingIncludes>
<args>
<arg>-Xannotate</arg>
</args>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>0.6.0</version>
</plugin>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics-annotate</artifactId>
<version>0.6.0</version>
</plugin>
</plugins>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
这是目录文件:
PUBLIC "http://com.test.schema/common/Context" "maven:com.bar.foo:schema-a:jar::1.2!"
xjb 文件中有一些配置以确保将 XmlRootElement 写入某些生成的 类:
<jxb:bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
jxb:version="2.1" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:annox="http://annox.dev.java.net" extensionBindingPrefixes="xjc">
<jxb:globalBindings>
<xjc:simple />
</jxb:globalBindings>
<jxb:bindings
schemaLocation="A.xsd">
<jxb:bindings node="//xsd:complexType[@name='ADataType']">
<jxb:class name="AData" />
<annox:annotate>
<annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement"
name="AData" />
</annox:annotate>
</jxb:bindings>
</jxb:bindings>
尽管为 xjc 执行提供了剧集和目录文件中 B.xsd 的架构位置,但正在生成 B.xsd 的 类。
问题是目录文件引用的 Maven 工件没有被拾取。我在 Maven 构建日志中看到以下错误:
Malformed URL on system identifier: maven:com.bar.foo:schema-b:jar::1.2!
PUBLIC: http://com.test.schema/common/Context
maven:com.bar.foo:schema-a:jar::1.2!
任何人都可以帮助我告诉我为什么我会为包含 B.xsd 的工件遇到这个格式错误的 URL 错误吗?任何帮助将不胜感激。
免责声明:我是 maven-jaxb2-plugin.
的作者
首先,您可能在这里混用了 A
和 B
。您是说 A
导入 B
但随后您将 schema-a
工件用作剧集。如果导入了 B
,编译 A
.
时,你应该使用 schema-b
作为 episode 不重新生成 B
东西
不过我觉得这可能只是题中的一个小错误。
这里有两个方面 - 剧集和目录。
剧集允许您跳过已经在其他地方生成的 类 的生成。因此,如果您在编译 schema-a
时使用 schema-b
工件,则 XJC 不应为 schema-b
生成 类。你不需要目录,它是独立的。
有时 XJC 仍然会产生一些剩余的东西——即使你使用了一集。我经常得到 ObjectFactory
并且可能生成一些枚举或顶级元素。我相信这是 XJC 中的一个问题,maven-jaxb2-plugin 我对此无能为力。
因此,作为一种解决方法,我只是使用 maven-antrun-plugin
来删除不必要的生成的东西。
如果你生成了所有 B
的东西,那么你应该检查 schema-b
神器是否真的生成了剧集文件。检查 JAR 中是否有 META-INF/sun-jaxb.episode
。有关剧集文件的一些琐事,请参阅 this answer。
因此,如果您正确配置了正确的剧集工件,您应该不会生成 B
东西,为此您不需要目录。
你需要这个目录是为了避免编译时下载http://com.test.schema/common/Context/B.xsd
。您可以使用目录指向另一个位置。我认为您的问题是您将 http://com.test.schema/common/Context
引用到 maven:com.bar.foo:schema-a:jar::1.2!
,这显然没有指向架构资源。
如果你有像
这样的导入
<xsd:import namespace="http://com.test.schema/common/Context" schemaLocation="http://com.test.schema/common/Context/B.xsd"/>
那么你应该重写如下:
PUBLIC "http://com.test.schema/common/Context" "maven:com.bar.foo:schema-b:jar::1.2!/common/Context/B.xsd"
假设 schema-b
个工件包含您的架构 /common/Context/B.xsd
。请注意,它映射 命名空间 ,而不是 架构位置 。
您还可以使用 REWRITE_SYSTEM
重写架构位置。例如:
REWRITE_SYSTEM "http://com.test.schema" "maven:com.bar.foo:schema-b:jar::1.2!"
如果你有一个 URL 像 http://com.test.schema/common/Context/B.xsd
,它将被重写为 maven:com.bar.foo:schema-b:jar::1.2!/common/Context/B.xsd
。这将指向 schema-b
JAR 中的资源 /common/Context/B.xsd
。
另一个提示 - 如果您在项目中使用 schema-b
作为依赖项,则可以省略版本。
这是一个真实世界项目的目录示例:
https://github.com/highsource/ogc-schemas/blob/master/schemas/src/main/resources/ogc/catalog.cat
它包含如下重写:
REWRITE_SYSTEM "http://schemas.opengis.net" "maven:org.jvnet.ogc:ogc-schemas:jar::!/ogc"
我的项目包含 A.xsd,它从属于另一个项目的 B.xsd 导入如下架构:
<xsd:import namespace="http://com.test.schema/common/Context" schemaLocation="http://com.test.schema/common/Context/B.xsd"/>
我正在尝试使用包含 B.xsd 的项目中的剧集,以便在解析 A.xsd 时不会重新生成与 B.xsd 相关的 类 .所以我参考 this and this 提出以下配置: 这是 pom.xml
<dependencies>
<dependency>
<groupId>com.bar.foo</groupId>
<artifactId>schema-b</artifactId>
<version>1.2</version>
</dependency>
<dependencies>
.
.
.
.
.
<build>
<plugins>
<dependency>
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.13.0</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<extension>true</extension>
<episodes>
<episode>
<groupId>com.bar.foo</groupId>
<artifactId>schema-b</artifactId>
</episode>
</episodes>
<catalog>src/main/resources/catalog.cat</catalog>
<schemas>
<schema>
<fileset>
<directory>${basedir}/src/main/schemas</directory>
<includes>
<include>A.xsd</include>
<include>...</include>
<include>...</include>
</includes>
</fileset>
</schema>
</schemas>
<bindingDirectory>${basedir}/src/main/schemas</bindingDirectory>
<bindingIncludes>
<include>*.xjb</include>
</bindingIncludes>
<args>
<arg>-Xannotate</arg>
</args>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>0.6.0</version>
</plugin>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics-annotate</artifactId>
<version>0.6.0</version>
</plugin>
</plugins>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
这是目录文件:
PUBLIC "http://com.test.schema/common/Context" "maven:com.bar.foo:schema-a:jar::1.2!"
xjb 文件中有一些配置以确保将 XmlRootElement 写入某些生成的 类:
<jxb:bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
jxb:version="2.1" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:annox="http://annox.dev.java.net" extensionBindingPrefixes="xjc">
<jxb:globalBindings>
<xjc:simple />
</jxb:globalBindings>
<jxb:bindings
schemaLocation="A.xsd">
<jxb:bindings node="//xsd:complexType[@name='ADataType']">
<jxb:class name="AData" />
<annox:annotate>
<annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement"
name="AData" />
</annox:annotate>
</jxb:bindings>
</jxb:bindings>
尽管为 xjc 执行提供了剧集和目录文件中 B.xsd 的架构位置,但正在生成 B.xsd 的 类。
问题是目录文件引用的 Maven 工件没有被拾取。我在 Maven 构建日志中看到以下错误:
Malformed URL on system identifier: maven:com.bar.foo:schema-b:jar::1.2!
PUBLIC: http://com.test.schema/common/Context
maven:com.bar.foo:schema-a:jar::1.2!
任何人都可以帮助我告诉我为什么我会为包含 B.xsd 的工件遇到这个格式错误的 URL 错误吗?任何帮助将不胜感激。
免责声明:我是 maven-jaxb2-plugin.
的作者首先,您可能在这里混用了 A
和 B
。您是说 A
导入 B
但随后您将 schema-a
工件用作剧集。如果导入了 B
,编译 A
.
schema-b
作为 episode 不重新生成 B
东西
不过我觉得这可能只是题中的一个小错误。
这里有两个方面 - 剧集和目录。
剧集允许您跳过已经在其他地方生成的 类 的生成。因此,如果您在编译 schema-a
时使用 schema-b
工件,则 XJC 不应为 schema-b
生成 类。你不需要目录,它是独立的。
有时 XJC 仍然会产生一些剩余的东西——即使你使用了一集。我经常得到 ObjectFactory
并且可能生成一些枚举或顶级元素。我相信这是 XJC 中的一个问题,maven-jaxb2-plugin 我对此无能为力。
因此,作为一种解决方法,我只是使用 maven-antrun-plugin
来删除不必要的生成的东西。
如果你生成了所有 B
的东西,那么你应该检查 schema-b
神器是否真的生成了剧集文件。检查 JAR 中是否有 META-INF/sun-jaxb.episode
。有关剧集文件的一些琐事,请参阅 this answer。
因此,如果您正确配置了正确的剧集工件,您应该不会生成 B
东西,为此您不需要目录。
你需要这个目录是为了避免编译时下载http://com.test.schema/common/Context/B.xsd
。您可以使用目录指向另一个位置。我认为您的问题是您将 http://com.test.schema/common/Context
引用到 maven:com.bar.foo:schema-a:jar::1.2!
,这显然没有指向架构资源。
如果你有像
这样的导入<xsd:import namespace="http://com.test.schema/common/Context" schemaLocation="http://com.test.schema/common/Context/B.xsd"/>
那么你应该重写如下:
PUBLIC "http://com.test.schema/common/Context" "maven:com.bar.foo:schema-b:jar::1.2!/common/Context/B.xsd"
假设 schema-b
个工件包含您的架构 /common/Context/B.xsd
。请注意,它映射 命名空间 ,而不是 架构位置 。
您还可以使用 REWRITE_SYSTEM
重写架构位置。例如:
REWRITE_SYSTEM "http://com.test.schema" "maven:com.bar.foo:schema-b:jar::1.2!"
如果你有一个 URL 像 http://com.test.schema/common/Context/B.xsd
,它将被重写为 maven:com.bar.foo:schema-b:jar::1.2!/common/Context/B.xsd
。这将指向 schema-b
JAR 中的资源 /common/Context/B.xsd
。
另一个提示 - 如果您在项目中使用 schema-b
作为依赖项,则可以省略版本。
这是一个真实世界项目的目录示例:
https://github.com/highsource/ogc-schemas/blob/master/schemas/src/main/resources/ogc/catalog.cat
它包含如下重写:
REWRITE_SYSTEM "http://schemas.opengis.net" "maven:org.jvnet.ogc:ogc-schemas:jar::!/ogc"