gpt4 book ai didi

java - 如何使用 JAXB XJC 从外部 XSD 文件生成类

转载 作者:搜寻专家 更新时间:2023-11-01 01:16:46 26 4
gpt4 key购买 nike

我有两个项目:

一个/src/main/resources/schema.xsd pom.xml

乙/src/主/根pom.xml

我想在 B 项目中从 A 项目中存在的 XSD 生成类

在 B 项目的 pom.xml 中我有:

<dependencies>
<dependency>
<groupId>test</groupId>
<artifactId>A</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<executions>
<execution>
<id>xjc</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<schemaDirectory>src/main/resources</schemaDirectory>
<outputDirectory>src/main/gen</outputDirectory>
</configuration>
</plugin>
</plugins>

</build>

但在类路径中找不到 xsd 文件:

无法在项目 B 上执行目标 org.codehaus.mojo:jaxb2-maven-plugin:1.5:xjc (xjc):未找到模式

如何使用另一个项目中的 xsd?

最佳答案

我的 maven-jaxb2-plugin支持separate schema compilation .

如何做到这一点:

  • 将您的工件a 添加为剧集。
  • 如果 a.xsd 被导入到 b.xsd 中,您必须在编译 b 时使这个模式对 JAXB 可用:
    • 一种方法是使用 Maven 依赖插件从工件 a 中提取 a.xsd
    • 另一种方法是使用目录文件将 a.xsd 的位置重写到工件 a

参见 this test project例如。

项目a完全不引人注目。只需编译架构 a.xsd

项目b更有趣。让我们来看看。

pom.xml :

        <plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<configuration>
<catalog>src/main/resources/catalog.cat</catalog>
<episodes>
<episode>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin-tests-MAVEN_JAXB2_PLUGIN-82-a</artifactId>
</episode>
</episodes>
</configuration>
</plugin>

配置说使用工件 a 作为剧集。所以当 JAXB/XJC 遇到在 a 中编译的类时,它会重用它们而不是生成新的类。

顺便说一下,您可以使用 useDependenciesAsEpisodes而不是配置单个剧集。在这种情况下,所有的依赖项都将被视为非常方便的情节(更少的配置)。

配置还说要使用the catalog file :

REWRITE_SYSTEM "http://www.ab.org" "maven:org.jvnet.jaxb2.maven2:maven-jaxb2-plugin-tests-MAVEN_JAXB2_PLUGIN-82-a:jar::!"

这指示 JAXB/XJC 将所有以 http://www.ab.org 开头的模式 URL 重写为以 maven:org.jvnet.jaxb2.maven2:maven-jaxb2 开头-plugin-tests-MAVEN_JAXB2_PLUGIN-82-a:jar::! 代替。后者会被maven-jaxb2-plugin处理,最终解析到a中的资源。

让我们仔细看看。架构 b.xsd imports http://www.ab.org/a.xsd :

<import namespace="urn:a" schemaLocation="http://www.ab.org/a.xsd"/>

这将被重写为 maven:org.jvnet.jaxb2.maven2:maven-jaxb2-plugin-tests-MAVEN_JAXB2_PLUGIN-82-a:jar::!/a.xsd 这将是解析为项目 a 的 JAR 中的 a.xsd。因此,最后,JAXB/XJC 将能够从 a 的 JAR 工件中读取此模式。

您还可以使用 PUBLIC 而不是 REWRITE_SYSTEM 来引用每个 namespace URI 的 a.xsd 而不是模式位置(这在逻辑上更好) :

PUBLIC "urn:a" "maven:org.jvnet.jaxb2.maven2:maven-jaxb2-plugin-tests-MAVEN_JAXB2_PLUGIN-82-a:jar::!/a.xsd"

但是有一个 bug in JAXB/XJC如果您的 xs:import 中有 schemaLocation,这将不起作用。

目前这会起作用:

<xsd:import namespace="urn:a"/>

这暂时不起作用:

<xsd:import namespace="urn:a" schemaLocation="a.xsd"/>

我已经向 Oracle 发送了一个 pull request它修复了该问题,但尚未应用。

上面的解释适用于 maven-jaxb2-plugin并在版本中工作 0.10.0和更高。

您原来的问题是关于 jaxb2-maven-plugin来自 Codehaus,这是一个不同的 Maven 插件。这个插件不具备我上面描述的所有功能,但至少剧集应该可以通过 arguments 运行。 . Catalogs也必须工作,但我相信,jaxb2-maven-plugin 不支持解析 Maven 工件中的模式。您可以使用 maven-dependency-plugin 从工件 a 中提取 a.xsd

免责声明:我是 maven-jaxb2-plugin 的作者。

审阅者请注意:我无意在这里推送/宣传我的插件,我只是想为所问的问题提供解决方案。看来我的项目提供了最好/最优雅和完整的解决方案。

关于java - 如何使用 JAXB XJC 从外部 XSD 文件生成类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26296654/

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