gpt4 book ai didi

编译依赖于多个模块的模块时,Maven Jaxb 生成失败

转载 作者:行者123 更新时间:2023-12-04 18:31:52 27 4
gpt4 key购买 nike

我有一个由多个模块组成的 Eclipse Maven 项目,其中一些包含我想要为其生成类的 Xml 模式(使用 Jaxb)。我的项目布局如下:

schemas\core (pom)
schemas\core\types (jar)
schemas\vehicle (pom)
schemas\vehicle\automobile (jar)
schemas\vehicle\civic (jar)

包含模式的项目是:
schemas\core\types (xsd\types.xsd)
schemas\vehicle\automobile (xsd\automobile.xsd)
schemas\vehicle\civic (xsd\civic.xsd)

一些模块包含从其他模块导入模式的模式:
automobile.xsd imports types.xsd
civic.xsd imports types.xsd, automobile.xsd

由于模式位于不同的项目中,我使用类路径目录解析器和目录文件来解析模式的位置。

汽车项目依赖于类型项目中的模式。这是其目录文件 (catalog.xml) 中的条目:
<rewriteSystem systemIdStartString="http://schemas/core/types/" rewritePrefix="classpath:xsd/" />

请注意使用 classpath:xsd/来告诉目录解析器在类路径上查找模式。

我还使用情节来防止类型中的类在汽车项目中重新生成。这是我的 pom.xml 中的一个片段:
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.8.3</version>
<configuration>
<episodes>
<episode>
<groupId>schemas.core</groupId>
<artifactId>types</artifactId>
<version>1.0-SNAPSHOT</version>
</episode>
<episodes>
<catalog>src/main/resources/catalog.xml</catalog>
<catalogResolver>org.jvnet.jaxb2.maven2.resolver.tools.ClasspathCatalogResolver</catalogResolver>
<extension>true</extension>
....

当我在汽车项目上运行 mvn clean install 时,一切工作文件。模式 types.xsd 在类路径上解析,最终生成类。

我遇到问题的地方是尝试编译 civic 项目。

civic 项目同时依赖于 types.xsd 和汽车.xsd。我使用目录文件 (catalog.xml) 来定义模式的位置:
<rewriteSystem systemIdStartString="http://schemas/core/types/" rewritePrefix="classpath:xsd/" />
<rewriteSystem systemIdStartString="http://schemas/vehicle/automobile/" rewritePrefix="classpath:xsd/" />

我使用剧集来防止类的重新生成。这是来自 pom.xml 的 civic 的片段:
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.8.3</version>
<configuration>
<episodes>
<episode>
<groupId>schemas.core</groupId>
<artifactId>types</artifactId>
<version>1.0-SNAPSHOT</version>
</episode>
<episode>
<groupId>schemas.vehicle</groupId>
<artifactId>automobile</artifactId>
<version>1.0-SNAPSHOT</version>
</episode>
</episodes>
<catalog>src/main/resources/catalog.xml</catalog>
<catalogResolver>org.jvnet.jaxb2.maven2.resolver.tools.ClasspathCatalogResolver</catalogResolver>
<extension>true</extension>
...

当我尝试在 civic 项目上运行 mvn clean install 时,我遇到了问题。它提示无法解析公共(public)/系统 ID。以下是我收到的一些错误消息:
Could not resolve publicId [null], systemId [jar:file:/_m2repository/schemas/vehicle/automobile/1.0-SNAPSHOT/automobile-1.0-SNAPSHOT.jar!http://schemas/core/types/types.xsd]
[ERROR] Error while parsing schema(s).Location [].
com.sun.istack.SAXParseException2;
IOException thrown when processing "jar:file:/_m2repository/schemas/vehicle/automobile/1.0-SNAPSHOT/automobile-1.0-SNAPSHOT.jar!http://schemas/core/types/types.xsd".
Exception: java.net.MalformedURLException: no !/ in spec.
....

由于某种原因,它在尝试解析汽车项目中的 jar 文件时找不到 types.xsd。

有谁知道为什么会发生这种情况?

谢谢你。

注意 - 我正在尝试使用捆绑来让事情正常工作,但我确实找到了一种方法。如果我从 pom.xml 文件中删除剧集,我将不再收到错误,但是,项目 civic 最终会包含依赖模块中的所有类型(这是我试图通过使用剧集来避免的事情)。

civic project generated java classes

如果您想查看每个项目的完整 catalog.xml 和 pom.xml 文件,请查看以下链接:

类型: http://pastebin.com/Uym3DY6X

汽车: http://pastebin.com/VQM4MPuW

公民: http://pastebin.com/eGSVGwmE

最佳答案

maven-jaxb2-plugin 的作者这里。

我只有 released 0.10.0 maven-jaxb2-plugin 的版本.此版本修复了 MAVEN_JAXB2_PLUGIN-82与报告的问题有关的问题。

这实际上不是 maven-jaxb2-plugin 中的错误。 ,但是 XJC 本身的一个问题(或者,最好说几个问题):

  • https://java.net/jira/browse/JAXB-1044
  • https://java.net/jira/browse/JAXB-1045
  • https://java.net/jira/browse/JAXB-1046

  • 当目录和绑定(bind)文件一起使用时,这些问题会导致问题。这也是 Maven Artifact 解析在某些情况下无法正常工作的原因。

    在 0.10.0 版本中,我为 JAXB-1044 和 JAXB-1045 实现了变通方法。我将尝试通过拉取请求将我的补丁提交给 XJC,但你知道,我不确定 Oracle 人员何时/是否会接受我的 PR。

    maven-jaxb2-plugin我现在已经实现了相当可靠的解决方法。在此处查看此测试项目:

    https://github.com/highsource/maven-jaxb2-plugin/tree/master/tests/MAVEN_JAXB2_PLUGIN-82

    这正是您想要的:通过目录和 Maven 解析器将架构解析为来自另一个 Artifact 的资源。基本上,这种重写:
    REWRITE_SYSTEM "http://www.ab.org" "maven:org.jvnet.jaxb2.maven2:maven-jaxb2-plugin-tests-MAVEN_JAXB2_PLUGIN-82-a:jar::!"

    现在工作正常。

    如果遇到问题,请执行 mvn -X并检查输出,您还将在日志中看到目录解析器的语句。这可能会给你提示,什么不起作用。

    这是另一个项目,它使用来自一个中心 Artifact 的模式、绑定(bind)和目录本身:

    https://github.com/highsource/w3c-schemas

    来自 POM 的片段:
                        <schemas>
    <schema>
    <url>http://www.w3.org/1999/xlink.xsd</url>
    </schema>
    </schemas>

    <schemaIncludes/>
    <bindings>
    <binding>
    <dependencyResource>
    <groupId>${project.groupId}</groupId>
    <artifactId>w3c-schemas</artifactId>
    <resource>globalBindings.xjb</resource>
    <version>${project.version}</version>
    </dependencyResource>
    </binding>
    </bindings>
    <catalogs>
    <catalog>
    <dependencyResource>
    <groupId>${project.groupId}</groupId>
    <artifactId>w3c-schemas</artifactId>
    <resource>catalog.cat</resource>
    <version>${project.version}</version>
    </dependencyResource>
    </catalog>
    </catalogs>

    目录:
    REWRITE_SYSTEM "http://www.w3.org" "maven:org.hisrc.w3c:w3c-schemas:jar::!/w3c"

    捆绑:
    <jaxb:bindings schemaLocation="http://www.w3.org/1999/xlink.xsd" node="/xs:schema">
    <jaxb:schemaBindings>
    <jaxb:package name="org.hisrc.w3c.xlink.v_1_0"/>
    </jaxb:schemaBindings>
    </jaxb:bindings>

    那么这一切是如何运作的:
  • 模式以及目录和全局绑定(bind)存储在中央 Artifact w3c-schemas 中.
  • 项目要编译的网址http://www.w3.org/1999/xlink.xsd .
  • 目录将此 URL 重写为 systemId maven:org.hisrc.w3c:w3c-schemas:jar::!/w3c/1999/xlink.xsd . (在 /w3c/1999/xlink.xsd jar 中有一个 w3c-schemas 资源)。
  • 然后这个 systemId 被我的 Maven 目录解析器(传递给我的 maven-jaxb2-plugin )解析为“真实” URL,它将是一些 jar:...指向 w3c-schemas 中资源的 URL本地存储库中的 Artifact JAR。
  • 因此,模式不是从 Internet 下载的,而是从本地资源中获取的。
  • 解决方法保留“原始”系统 ID,因此您可以使用其原始 URL 自定义架构。 (解析出来的systemId不方便。)
  • 目录文件和全局绑定(bind)文件对于所有单个项目都是相同的,因此它们也被放入中央 Artifact 并使用 dependencyResource 引用。 .
  • 关于编译依赖于多个模块的模块时,Maven Jaxb 生成失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18163565/

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