You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建引用独立JAR依赖中另一个XSD的XSD文件

问题解决方案

1. 正确实现XSD引用的两种方法

方法一:使用Catalog映射命名空间(适合直接引用XSD的场景)

步骤1:配置module_A对module_B的依赖

在module_A的pom.xml中添加module_B的依赖,确保编译时能获取到module_B的JAR资源:

<dependency>
    <groupId>你的项目groupId</groupId>
    <artifactId>module_B</artifactId>
    <version>对应版本号</version>
</dependency>

步骤2:创建Catalog文件

在module_A的src/main/resources下新建catalog.cat文件,映射XSD_B的命名空间到类路径中的XSD文件:

PUBLIC "http://my.own.targetNamespace" "classpath:/XSD_B.xsd"

注:XSD_B位于module_B的resources目录,打包后会在JAR根目录,所以路径为/XSD_B.xsd。

步骤3:配置XJC插件引用Catalog

修改module_A中maven-jaxb2-plugin的配置,指定catalog文件路径:

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <schemas>
                    <schema>
                        <file>src/main/resources/XSD_A.xsd</file>
                    </schema>
                </schemas>
                <catalog>src/main/resources/catalog.cat</catalog>
            </configuration>
        </execution>
    </executions>
</plugin>

步骤4:修改XSD_A的引用

XSD_A中仅需指定命名空间,无需写本地路径:

<xs:import namespace="http://my.own.targetNamespace"/>

方法二:使用Episode复用已生成的Java类(更高效,避免重复编译)

这种方式会让module_A直接复用module_B编译XSD_B生成的Java类,无需再次解析XSD_B。

步骤1:在module_B中配置生成Episode

修改module_B的maven-jaxb2-plugin配置,开启episode生成:

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <schemas>
                    <schema>
                        <file>src/main/resources/XSD_B.xsd</file>
                    </schema>
                </schemas>
                <generateEpisode>true</generateEpisode>
            </configuration>
        </execution>
    </executions>
</plugin>

打包后module_B的JAR会包含META-INF/jaxb/episode.xsd文件。

步骤2:在module_A中引用Episode

修改module_A的maven-jaxb2-plugin配置,引入module_B的episode:

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <schemas>
                    <schema>
                        <file>src/main/resources/XSD_A.xsd</file>
                    </schema>
                </schemas>
                <episodes>
                    <episode>
                        <groupId>你的项目groupId</groupId>
                        <artifactId>module_B</artifactId>
                    </episode>
                </episodes>
            </configuration>
        </execution>
    </executions>
</plugin>

步骤3:修改XSD_A的引用

同样只需指定命名空间即可:

<xs:import namespace="http://my.own.targetNamespace"/>

2. 非本地编译的构建兼容性

只要确保以下两点,非本地环境(如CI/CD流水线)可以正常构建:

  • module_A的pom.xml中正确配置了module_B的依赖,且module_B已发布到Maven仓库(或私有仓库)
  • 使用上述两种方法之一配置XJC插件

Maven会自动从仓库拉取module_B的JAR,XJC插件能从依赖JAR中读取所需的XSD或episode文件,无需本地存在XSD_B的物理文件。

内容的提问来源于stack exchange,提问作者dtchmnt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:44:56