gpt4 book ai didi

java - xjc 或 jaxb2-maven-plugin 或 maven : weird behavior while compiling XSDs, 处理文件两次但名称已更改?

转载 作者:太空宇宙 更新时间:2023-11-04 06:24:55 25 4
gpt4 key购买 nike

不确定问题出在哪里;我怀疑 XJC 但它是由 jaxb2-maven-plugin 驱动的在 maven 内,所以有几层需要解压。

我正在编译一个 XSD 文件夹,它似乎处理每个文件两次,一次使用实际文件名,一次使用稍微改变的文件名。 [顺便说一下,这是在 OSX 上,但我认为这根本不是一个直接区分大小写的文件系统问题(稍后您将看到)。]

这是 pom.xml 的相关部分:

  <plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>xjc</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<schemaDirectory>src/main/resources</schemaDirectory>
</configuration>
</plugin>
src/main/resources包含这些 XSD:
ATIS_03_00_74_Local.xsd     ITIS_Final_3_0_0.xsd        LRMS_Final_09_07.xsd        TCIP_4_0_0_Final.xsd
ATIS_Partial_03_00_74.xsd ITIS_Final_3_0_0_for_atis.xsd LRMS_Final_09_07_for_atis.xsd TCIP_4_0_0_Local.xsd
IM_03_00_38_Local.xsd ITIS_Local_for_atis.xsd LRMS_Final_09_07_for_im.xsd TMDD_Partial_0_0_0.xsd
IM_Partial_03_00_38.xsd ITIS_Local_for_im.xsd LRMS_Local_for_atis.xsd
ITIS_3_0_0_Local.xsd LRMS_09_07_Local.xsd LRMS_Local_for_im.xsd

当我运行 maven ,它在非常单一的文件上失败,例如:
[ERROR] file:/Users/dhaskin/clients/cs/onebusaway-nyc/onebusaway-nyc-tcip-api/src/main/resources/atis_Partial_03_00_74.xsd[35,50]
org.xml.sax.SAXParseException: 'RouteRequest' is already defined
...
[ERROR] file:/Users/dhaskin/clients/cs/onebusaway-nyc/onebusaway-nyc-tcip-api/src/main/resources/ATIS_Partial_03_00_74.xsd[22,38]
org.xml.sax.SAXParseException: (related to above error) the first definition appears here
...

请注意,第一个错误中的文件名甚至不存在;它与第二个文件名(确实存在)相同,第一个下划线分隔的单词转换为小写(但请注意第二个单词 Partial 保持不变)。

maven -X输出,我很确定是 XJC 本身在做这个,但我还不能确定如何修复它。

请注意,此项目是较大的 maven 中的子项目。项目,但我认为这无关紧要。对于它的值(value),我的 maven父项目中的命令行是: mvn -X -U install -pl onebusaway-nyc-tcip-api . ( onebusaway-nyc-tcip-api 是这个子项目。)

最佳答案

好的,我已经检查了您的架构。

你原来的问题是由于不正确的进口。例如,模式 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那么每个模式只被访问一次。操作系统在访问文件时很乐意忽略大小写,一切正常。

我已经在以下 demo project 中试验了您的模式. (Schemas ZIP 是在构建过程中下载的,因此在法律上没有问题)。我不得不添加一个绑定(bind)文件,但让它工作得相当快。这适用于我的机器(Windows),但我认为这可能会在 *nix 上失败。不过不确定。

然后我想我可以使用目录文件来解决架构 URL 中的案例问题。

令我遗憾的是,这并不容易。

首先,我发现编译本地文件时重写系统ID是不切实际的。要重写的 URL 以完全限定的绝对 file://.../schema.xsd 形式给出URL,因此在目录文件中包含此类重写规则将使目录文件特定于目录/机器,这是不切实际的。这实际上是 XJC 目录解析器的问题,但我 will try to address it .

接下来,我认为如果本地文件 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>

网址 http://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 解析模式至 src/main/resources :
REWRITE_SYSTEM "http://www.aptatcip.com/APTA-TCIP-S-01%204.0_files/Schema%20Set.zip!/Schema%20Set/" "./"

我想,然后我们可以重写无效的小写 URL,每个人都很高兴。

好吧,这有效,但仅适用于绝对网址 http://www.aptatcip.com/APTA-TCIP-S-01%204.0_files/Schema%20Set.zip!/Schema%20Set/TCIP_4_0_0_Final.xsd . XJC 试图将相对导入解析为像 lrms_Final_09_07.xsd 这样的相对 URL。而不是(如我所料)作为绝对 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 倍,但它可以工作。这里是 another demo project现在也可以毫无错误地构建。

不幸的是,我不得不说目录仍然不能令人满意。我在 中提交了以下问题:
  • Allow rewriting system ids for local files
  • Allow rewriting relative import URLs with base absolute URLs as absolute URL
  • Rewriting relative import URLs with base absolute URLs must not be mandatory

  • 要清楚,从我的角度来看 这些问题都不是我的maven-jaxb2-plugin 中的错误。 .这是我从 XJC 和那里使用的目录解析器“继承”的东西。

    但我会尝试在我的插件中解决它。

    关于java - xjc 或 jaxb2-maven-plugin 或 maven : weird behavior while compiling XSDs, 处理文件两次但名称已更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26920583/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com