1

不确定问题出在哪里;我怀疑 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/resourcesXSD:

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项目中的子项目,但我认为这无关紧要。对于它的价值,我maven在父项目中的命令行是:mvn -X -U install -pl onebusaway-nyc-tcip-api. (onebusaway-nyc-tcip-api是这个子项目。)

4

3 回答 3

1

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

你原来的问题是由于不正确的进口。例如,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.xsdURL 给出,因此在目录文件中包含此类重写规则将使目录文件特定于目录/机器,这是不切实际的。这实际上是一个 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%20Setto解析为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. 这是我从 XJC 和那里使用的目录解析器“继承”的东西。

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

于 2014-11-15T16:59:59.670 回答
0

这可能是很多很多事情。

  • 首先,检查你import的 s 和includes,错误的名字很可能来自其中一个。(归功于 Xstian)。
  • 如果是这样,请考虑使用目录文件来修复它。
  • 接下来,由于错误指向架构文件中的两个不同位置,因此我还会考虑架构中出现错误的可能性。你有什么?你能展示相关的模式片段吗?它是我们可以检查的一些公共模式吗?
  • 可能是一个相关问题。

好的,我将如何解决这个问题。

免责声明:我是的作者,也是OGC Schemas 项目的作者/主要开发者,该项目编译了大量的 GIS 模式

  • 我会使用我自己的插件
    • 修复了一些 XJC 问题
    • 输出有关架构解析的调试信息
  • 将所有模式放入src/main/resources
  • 检查所有imports 和includes 如果一切正确
  • import如果s 和s 中的模式位置出现问题include,我会编写一个目录文件来修复/重写无效引用
  • 我会运行编译mvn -X clean install并检查日志,特别是模式解析部分。
  • 如果出现问题,我会编辑目录文件,或者作为最后一项措施修补模式(有时你真的必须这样做)
  • 对于修补,我会创建一个单独的“原始”模式副本,并在构建期间使用 Maven 补丁插件应用补丁。(不仅仅是简单地编辑本地副本。)

我在提到的OGC Schemas Project中完成了所有这些工作。

架构解析日志可能如下所示的示例:

REWRITE_SYSTEM: http://www.w3.org
    maven:org.hisrc.w3c:w3c-schemas:jar::!/w3c
resolveSystem(http://schemas.opengis.net/gml/3.2.1/gml.xsd)
Resolved system: http://schemas.opengis.net/gml/3.2.1/gml.xsd
    maven:org.jvnet.ogc:ogc-schemas:jar::!/ogc/gml/3.2.1/gml.xsd
[DEBUG] Resolved dependency resource [Dependency {groupId=org.jvnet.ogc, artifactId=ogc-schemas, version=2.0.1-SNAPSHOT, type=jar, classifier=null, resource=ogc/gml/3.2.1/gml.xsd}] to resource URL [jar:file:/C:/Repository/org/jvnet/ogc/ogc-schemas/2.0.1-SNAPSHOT/ogc-schemas-2.0.1-SNAPSHOT.jar!/ogc/gml/3.2.1/gml.xsd].

这通常会阐明正在发生的事情以及加载了哪些模式。

大多数提示也适用于

于 2014-11-14T11:28:04.503 回答
0

@Xstian 有答案(尽管我在阅读评论之前找到了答案)。

我正在使用一个pom.xml我认为之前已经成功使用过的,但现在我不相信是这样的。

问题是我只需要编译主 XSD,它通过import. 因为我让 XJC 编译文件夹中的所有 XSD,所以它编译了其中一些两次,因此重复了定义。

通过将相关部分更改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>
      <schemaFiles>TCIP_4_0_0_Final.xsd</schemaFiles>
    </configuration>
  </plugin>
于 2014-11-14T16:31:34.723 回答