当前位置: 首页 > 知识库问答 >
问题:

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

满俊楠
2023-03-14

B/src/main/gen pom.xml

我想在B项目中从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>

共有1个答案

姜增
2023-03-14

我的Maven-jaxb2-plugin支持单独的模式编译。

如何做到这一点:

  • 添加工件A作为插曲。
  • 如果a.xsd导入到b.xsd中,则必须在编译b时使该模式对JAXB可用:
    • 这样做的一种方法是从工件中提取a.xsdA,例如使用Maven依赖项插件。
    • 另一种方法是使用目录文件将a.xsd的位置重写到工件中a

    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而不是配置单独的剧集。在这种情况下,所有的依赖关系都将被视为事件,这非常方便(配置较少)。

    REWRITE_SYSTEM "http://www.ab.org" "maven:org.jvnet.jaxb2.maven2:maven-jaxb2-plugin-tests-MAVEN_JAXB2_PLUGIN-82-a:jar::!"
    
    <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,它将被解析为项目JAR中的a.xsd。最后,JAXB/XJC将能够从A的JAR工件中读取这个模式。

    您还可以使用public而不是rewrite_system来引用每个命名空间URI的a.xsd,而不是架构位置(这在逻辑上更好):

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

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

    这在目前是可行的:

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

    这在当下行不通:

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

    我已经向Oracle发送了一个pull请求来修复这个问题,但它还没有被应用。

 类似资料:
  • 问题内容: 我有一个巨大的QuickBooks SDK .XSD模式文件,该文件定义了我可以从QuickBooks发送/接收的XML请求/响应。 我希望能够轻松地从这些.XSD文件生成Java类,然后将其用于将XML编组为Java对象,以及将Java对象编组为XML。 是否有捷径可寻…? 理想情况下,它在运行时不需要基本Java发行版外部的任何库。但是我很灵活 问题答案: JAXB确实可以满足您的

  • 有没有什么方法可以从wsdl生成xsd。任何链接或工具也可以。最简单的方法是什么?

  • Java11已经取消了对JAXB和xjc等工具的支持,这些工具从XSD模式生成Java文件。我在Gradle中找不到很多xjc代的例子,并尝试了一些选项,但到目前为止运气不佳。另外,在SpringBootGradle项目中应该添加哪些依赖项来提供对JAXB的全面支持?

  • 问题内容: 我有以下两个javascript函数: 1 2 我想将它们放在外部“ .js”文件中 1 2 调用这些函数的正确语法是什么? 问题答案: 像这样的代码 希望对您有帮助。…谢谢

  • myType也被定义为complexType。然后得到生成的类MyResponse.java和Reference.java。我可以通过以下方式分配“引用”的值: 而且奏效了。 现在我只是删除了maxOccurs=“unbounded”,它不再起作用了。响应不再是List类型,而是JaxBelement类型。我试着用: 谁能告诉我,当它不是一个列表时,什么是正确的做法?

  • 与JAXB为给定XSD生成JAXB类类似,Jackson是否提供了从XSD或JSON生成Jackson类的实用程序。 JAXB类geberator已经生成了一组为XSD模式定义的类。例如,对于多态类型,JAXB具有以下注释,以基于XML元素名称来标识名称。 是否可以在杰克逊中创建类似的类。即,基于XML元素名称来标识类型。