Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java xjc或jaxb2 maven插件或maven:编译XSD时的奇怪行为,处理两次文件,但更改名称?_Java_Maven_Jaxb_Xjc_Jaxb2 Maven Plugin_Maven Jaxb2 Plugin - Fatal编程技术网

Java xjc或jaxb2 maven插件或maven:编译XSD时的奇怪行为,处理两次文件,但更改名称?

Java xjc或jaxb2 maven插件或maven:编译XSD时的奇怪行为,处理两次文件,但更改名称?,java,maven,jaxb,xjc,jaxb2-maven-plugin,maven-jaxb2-plugin,Java,Maven,Jaxb,Xjc,Jaxb2 Maven Plugin,Maven Jaxb2 Plugin,不知道问题在哪里;我怀疑XJC,但它是由maven中的jaxb2-maven插件驱动的,因此有几个层需要解包 我正在编译一个XSD文件夹,它似乎要处理每个文件两次,一次是使用实际文件名,一次是使用稍微修改过的文件名。[顺便说一下,这是在OSX上,但我认为这根本不是一个直接的区分大小写的文件系统问题(稍后您将看到)。] 以下是pom.xml的相关部分: <plugin> <groupId>org.codehaus.mojo</groupId>

不知道问题在哪里;我怀疑XJC,但它是由
maven
中的
jaxb2-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>
当我运行
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-tcipapi
。(
onebusaway nyc tcip api
是这个子项目。)

这可以是很多事情

  • 首先,检查您的
    import
    s和
    include
    s,错误的名称很可能来自其中一个。(归功于Xstian)
  • 如果有,请考虑修复它。 下一步,因为错误指向模式文件中的两个不同的地方,所以我也会考虑在模式中出现错误的可能性。你有什么?您能显示相关的模式片段吗?这是我们可以检查的公共模式吗
  • 这可能是一个相关的问题
好的,我将如何解决这个问题

免责声明:我是的作者,也是该网站的作者/开发负责人,该网站编写了

  • 我会使用我自己的插件作为它
    • 修复了许多XJC问题
    • 输出有关模式解析的调试信息
  • 将所有模式放入
    src/main/resources
  • 检查所有
    import
    s和
    include
    s,如果一切正常
  • 如果
    import
    s和
    include
    s中的架构位置出现问题,我会编写一个目录文件来修复/重写无效引用
  • 我将使用
    mvn-xclean安装运行编译,并检查日志,特别是模式解析部分
  • 如果出现问题,我要么编辑目录文件,要么作为最后一项措施修补模式(有时确实需要这样做)
  • 对于补丁,我将创建一个单独的“原始”模式副本,并在构建过程中使用Maven补丁插件应用补丁。(不仅仅是编辑本地副本。)
所有这些我都是在上面提到的时间里做的

模式解析日志的示例如下:

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].
这通常会让我们了解正在发生的事情以及加载了哪些模式

大多数提示也适用于。

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

我以前使用的是一个
pom.xml
,我认为它以前已经成功使用过,但现在我不认为是这样

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

通过将
pom.xml
的相关部分更改为以下内容,我不再有这个问题(尽管我还有另一个问题,我将单独发布):


org.codehaus.mojo
jaxb2 maven插件
1.6
xjc
xjc
src/main/resources
TCIP_4_0_0_Final.xsd

好的,我已经检查了您的模式

您最初的问题是由于不正确的导入。例如,th schema
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"/>
这实际上是不正确的,因为URL实际上区分大小写。所以我想说,这些模式的导入结构是无效的

编译模式时,XJC创建并维护一个hashmap URL->schema文档,它使用该文档避免两次加载同一模式。URL(特别是“系统ID”)是区分大小写的

如果编译所有模式(
*.xsd
),则某些模式会(至少)两次包含到编译集中:第一次直接导入,第二次通过直接或间接导入。所以你基本上得到了两次
IM_Partial_03_00_38.xsd
。由于XJC对模式缓存使用区分大小写的系统ID,它认为这是两个不同的文档,试图编译同一个文件两次,这会导致冲突。(您得到的错误。)

如果您只是编译
TCIP_4_0_0_Final.xsd
,那么每个模式只能访问一次。在访问文件时,操作系统很乐意忽略大小写,一切正常

我已经在下面对您的模式进行了试验。(架构ZIP是在构建过程中下载的,因此在法律上没有问题)。我不得不添加一个绑定文件,但它运行得相当快。这在我的机器(Windows)上运行,但我认为在*nix上可能会失败。不过我不确定

然后我想我可以使用一个目录文件来修复模式URL中的案例问题

遗憾的是,这并不容易

首先,我发现在编译本地文件时重写系统ID是不实际的。要重写的URL以完全限定的绝对

  <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>
<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
<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>
REWRITE_SYSTEM "http://www.aptatcip.com/APTA-TCIP-S-01%204.0_files/Schema%20Set.zip!/Schema%20Set/" "./"
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"