好的,我已经检查了您的架构。
你原来的问题是由于不正确的进口。例如,th 模式TCIP_4_0_0_Final.xsd
具有以下导入:
<xs:import namespace="http://www.im-partial-03-00-38" schemaLocation="im_Partial_03_00_38.xsd"/>
<xs:import namespace="http://www.itis-final-3-0-0" schemaLocation="itis_Final_3_0_0.xsd"/>
<xs:import namespace="http://www.lrms-final-09-07" schemaLocation="lrms_Final_09_07.xsd"/>
<xs:import namespace="http://www.tcip-4-0-0-local" schemaLocation="tcip_4_0_0_local.xsd"/>
而文件以不同的大小写命名:
IM_Partial_03_00_38.xsd
ITIS_Final_3_0_0.xsd
LRMS_Final_09_07.xsd
TCIP_4_0_0_Local.xsd
这实际上是不正确的,因为 URL实际上是区分大小写的。所以我想说,这些模式的导入结构是无效的。
当您编译模式时,XJC 创建并维护一个 hashmap URL -> 模式文档,它使用它来避免两次加载相同的模式。URL(或“系统 ID”,特别是)被视为区分大小写。
如果您编译所有模式 ( *.xsd
),则某些模式会(至少)两次包含在编译集中:第一次直接导入,第二次通过直接或间接导入。所以你基本上得到IM_Partial_03_00_38.xsd
了两次。并且由于 XJC 使用区分大小写的系统 ID 作为模式缓存,它认为这是两个不同的文档,尝试编译同一个文件两次 - 这会导致冲突。(你得到的错误。)
如果您只是编译TCIP_4_0_0_Final.xsd
,那么每个模式只能访问一次。操作系统在访问文件时很乐意忽略大小写,一切正常。
我在以下演示项目中试验了您的模式。(Schemas ZIP 是在构建过程中下载的,因此在法律上没有问题)。我不得不添加一个绑定文件,但让它工作得相当快。这适用于我的机器(Windows),但我认为这可能会在 *nix 上失败。不过不确定。
然后我想我可以使用目录文件来解决架构 URL 中的案例问题。
令我遗憾的是,这并不容易。
首先,我发现编译本地文件时重写系统ID是不切实际的。要重写的 URL 作为完全限定的绝对file://.../schema.xsd
URL 给出,因此在目录文件中包含此类重写规则将使目录文件特定于目录/机器,这是不切实际的。这实际上是一个 XJC 目录解析器问题,但我会尝试解决它。
接下来,我认为如果本地文件 URL 不起作用,那么绝对 URL 会起作用。假设我们想从原始 URL 的 ZIP 文件中编译模式:
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<executions>
<execution>
<id>generate</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<schemaIncludes/>
<catalog>src/main/resources/catalog.cat</catalog>
<schemas>
<schema>
<url>http://www.aptatcip.com/APTA-TCIP-S-01%204.0_files/Schema%20Set.zip!/Schema%20Set/TCIP_4_0_0_Final.xsd</url>
</schema>
</schemas>
</configuration>
</execution>
</executions>
</plugin>
当然,URLhttp://www.aptatcip.com/APTA-TCIP-S-01%204.0_files/Schema%20Set.zip!/Schema%20Set/TCIP_4_0_0_Final.xsd
不起作用。(请记住,我们只是在假装。)但它提供了一个绝对 URL,它不是特定于机器的。
为了让 XJC 从这个 URL 解析模式,我们需要一个目录文件。如果我们在其中制作了模式的本地副本,src/main/resources
那么目录文件src/main/resource/catalog.cat
应该将模式从http://www.aptatcip.com/APTA-TCIP-S-01%204.0_files/Schema%20Set.zip!/Schema%20Set
to解析为src/main/resources
:
REWRITE_SYSTEM "http://www.aptatcip.com/APTA-TCIP-S-01%204.0_files/Schema%20Set.zip!/Schema%20Set/" "./"
我想,然后我们可以重写无效的小写 URL,每个人都很高兴。
好吧,这有效,但仅适用于绝对 urlhttp://www.aptatcip.com/APTA-TCIP-S-01%204.0_files/Schema%20Set.zip!/Schema%20Set/TCIP_4_0_0_Final.xsd
。XJC 试图将相对导入解析为相对 URL,lrms_Final_09_07.xsd
而不是(如我所料)作为绝对 URL,如http://www.aptatcip.com/APTA-TCIP-S-01%204.0_files/Schema%20Set.zip!/Schema%20Set/lrms_Final_09_07.xsd
.
有一秒钟,当我编译本地文件时,它们首先被解析为绝对 URL。当我尝试通过绝对URL 编译模式时,相对导入被解析为相对URL。
尽管如此,最后我还是到达了以下目录文件:
REWRITE_SYSTEM "http://www.aptatcip.com/APTA-TCIP-S-01%204.0_files/Schema%20Set.zip!/Schema%20Set/" "./"
REWRITE_SYSTEM "tmdd_Partial_0_0_0.xsd" "TMDD_Partial_0_0_0.xsd"
REWRITE_SYSTEM "lrms_Final_09_07.xsd" "LRMS_Final_09_07.xsd"
REWRITE_SYSTEM "atis_Partial_03_00_74.xsd" "ATIS_Partial_03_00_74.xsd"
REWRITE_SYSTEM "im_Partial_03_00_38.xsd" "IM_Partial_03_00_38.xsd"
REWRITE_SYSTEM "itis_Final_3_0_0.xsd" "ITIS_Final_3_0_0.xsd"
REWRITE_SYSTEM "tcip_4_0_0_local.xsd" "TCIP_4_0_0_Local.xsd"
REWRITE_SYSTEM "TCIP_4_0_0_Final.xsd" "TCIP_4_0_0_Final.xsd"
REWRITE_SYSTEM "atis_Partial_03_00_74.xsd" "atis_Partial_03_00_74.xsd"
REWRITE_SYSTEM "ITIS_Final_3_0_0_for_atis.xsd" "ITIS_Final_3_0_0_for_atis.xsd"
REWRITE_SYSTEM "ITIS_Local_for_atis.xsd" "ITIS_Local_for_atis.xsd"
REWRITE_SYSTEM "LRMS_Final_09_07_for_atis.xsd" "LRMS_Final_09_07_for_atis.xsd"
REWRITE_SYSTEM "LRMS_Local_for_atis.xsd" "LRMS_Local_for_atis.xsd"
REWRITE_SYSTEM "ATIS_03_00_74_Local.xsd" "ATIS_03_00_74_Local.xsd"
REWRITE_SYSTEM "TMDD_Partial_0_0_0.xsd" "TMDD_Partial_0_0_0.xsd"
REWRITE_SYSTEM "ITIS_Local_for_im.xsd" "ITIS_Local_for_im.xsd"
REWRITE_SYSTEM "LRMS_Final_09_07_for_im.xsd" "LRMS_Final_09_07_for_im.xsd"
REWRITE_SYSTEM "LRMS_Local_for_im.xsd" "LRMS_Local_for_im.xsd"
REWRITE_SYSTEM "IM_03_00_38_Local.xsd" "IM_03_00_38_Local.xsd"
REWRITE_SYSTEM "ITIS_3_0_0_Local.xsd" "ITIS_3_0_0_Local.xsd"
REWRITE_SYSTEM "LRMS_09_07_Local.xsd" "LRMS_09_07_Local.xsd"
将小写文件名重写为大写正是我想要做的。但是为什么我必须将所有其他文件名重写为相同的文件名,这超出了我的理解。
尽管如此,上面的目录文件是它应该是的 3 倍,但它可以工作。这是另一个演示项目,现在也可以无错误地构建。
不幸的是,我不得不说目录仍然不能令人满意。我在maven-jaxb2-plugin中提交了以下问题:
需要明确的是,从我的角度来看,这些问题都不是我的maven-jaxb2-plugin
. 这是我从 XJC 和那里使用的目录解析器“继承”的东西。
但我会尝试在我的插件中解决它。