使用CXF xsdtojava时Schema Include在Unix失效Windows正常
首先可以明确:你用<xs:include schemaLocation="cmsTypes.xsd"/>的语法本身是没问题的——因为两个XSD的targetNamespace完全一致,xs:include就是用来引入同命名空间的Schema片段的,这部分符合XML Schema规范。
问题大概率出在Windows和Unix环境的差异上,结合你本地Windows正常、Unix报错schema_reference.4(找不到引用的Schema)的情况,给你几个排查方向:
1. 文件名大小写问题
Windows文件系统是大小写不敏感的,哪怕你写的是cmsTypes.xsd,实际文件是Cmstypes.xsd也能正常识别;但Unix(包括Linux、macOS)是严格区分大小写的。你需要确认Unix环境下,主XSD所在目录里的文件确实是精确的cmsTypes.xsd,没有大小写拼写错误。
2. 相对路径的一致性
检查Unix环境下,cmsTypes.xsd是否和主XSD文件放在完全相同的目录下。如果你的构建脚本在Windows下复制文件时路径没问题,但到Unix下因为目录结构变化(比如构建输出目录的层级不同),导致主XSD找不到同目录的cmsTypes.xsd,就会报错。
你可以临时把schemaLocation改成Unix下的绝对路径(比如/opt/project/schemas/cmsTypes.xsd)测试,确认是否是路径问题。
3. 构建过程中资源文件的复制问题
有时候构建工具(比如Maven/Gradle)在Unix环境下可能因为配置问题,没有把cmsTypes.xsd正确复制到主XSD所在的输出目录。你可以直接到Unix环境的构建输出目录里查看,确认cmsTypes.xsd是否存在,位置是否和主XSD对应。
4. 额外的类路径/资源加载问题
如果你的Schema文件是放在类路径下的,Unix环境下的类路径配置可能和Windows不同。可以尝试在xsdtojava插件的配置里,明确指定Schema文件的基础目录,确保插件能正确扫描到依赖的XSD文件。
举个Maven插件配置的例子(如果用Maven的话):
<plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-xjc-plugin</artifactId> <version>3.6.2</version> <executions> <execution> <id>generate-sources</id> <phase>generate-sources</phase> <goals> <goal>xsdtojava</goal> </goals> <configuration> <sourceRoot>${project.build.directory}/generated-sources/xjc</sourceRoot> <xsdOptions> <xsdOption> <xsd>${project.basedir}/src/main/resources/schemas/main.xsd</xsd> <!-- 明确指定Schema所在的目录,让插件能找到依赖的XSD --> <xsdRootDir>${project.basedir}/src/main/resources/schemas</xsdRootDir> </xsdOption> </xsdOptions> </configuration> </execution> </executions> </plugin>
内容的提问来源于stack exchange,提问作者hell_storm2004

