使用maven jaxb2插件,使用剧集和目录的模块化编译会抛出格式错误的URL错误

时间:2015-10-01 13:02:46

标签: jaxb catalog maven-jaxb2-plugin malformedurlexception jaxb-episode

我的项目包含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相关的类。所以我提到thisthis来提出以下配置: 这是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的工件遇到这个格式错误的网址错误?任何帮助将非常感激。

1 个答案:

答案 0 :(得分:1)

免责声明:我是的作者。

首先,您可能在这里混合AB。您正在说A导入B,但之后您正在使用schema-a工件作为剧集。如果导入B,您应该使用schema-b作为剧集,以便在编译B时不重新生成A

但我认为这可能只是这个问题的一个小错误。

这里有两个方面 - 剧集和目录。

剧集允许您跳过已经在其他地方生成的课程。因此,如果在编译schema-b时使用schema-a工件,则XJC不应为schema-b生成类。你不需要那些目录,它是独立的。

有时XJC仍然会产生很少的剩余 - 即使你使用了一集。我经常得到ObjectFactory,也许会生成一些枚举或顶级元素。我相信这是XJC中的一个问题,关于它我无能为力。
因此,作为一种解决方法,我只需使用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!"

如果您有http://com.test.schema/common/Context/B.xsd之类的网址,则会将其重写为maven:com.bar.foo:schema-b:jar::1.2!/common/Context/B.xsd。这将指向/common/Context/B.xsd JAR中的资源schema-b

另一个提示 - 如果您在项目中使用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"