簡體   English   中英

如何使用JAXB XJC從外部XSD文件生成類

[英]How can I generate classes from outside XSD file using JAXB XJC

我有兩個項目:

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

B / src / main / gen pom.xml

我想在B項目中生成來自XSD的類,它存在於A Project中

在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支持單獨的模式編譯

這個怎么做:

  • 添加您的神器a作為插曲。
  • 如果將a.xsd導入b.xsd ,則在編譯b時必須使此架構可用於JAXB:
    • 一種方法是使用Maven依賴插件從工件a提取a.xsd
    • 另一種方法是使用目錄文件將a.xsd的位置重寫為工件a

例如,請參閱此測試項目

項目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而不是配置單個劇集。 在這種情況下,所有依賴關系都將被視為劇集,非常方便(配置較少)。

配置還說要使用目錄文件

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:org.jvnet.jaxb2.maven2:maven-jaxb2-plugin-tests-MAVEN_JAXB2_PLUGIN-82-a:jar::! 代替。 后者將被處理的maven-jaxb2-plugin和最終解決在資源a

讓我們仔細看看。 模式b.xsd 導入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將解析為JAR中的a.xsd項目a 因此,最后,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"

但是,如果在xs:importschemaLocation ,則JAXB / XJC中存在一個錯誤

這可以在當下工作:

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

目前這不起作用:

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

我已向Oracle發送了拉取請求 ,該請求修復了該請求 ,但尚未應用。

上面的解釋適用於maven-jaxb2-plugin ,適用於0.10.0及更高版本。

您最初的問題是來自Codehaus的jaxb2-maven-plugin ,它是一個不同的Maven插件。 這個插件沒有我上面描述的所有功能,但至少劇集應該通過參數工作。 目錄也必須有效,但我相信, jaxb2-maven-plugin不支持在Maven工件中解析模式。 您可以使用maven-dependency-plugin從工件a提取a.xsd

免責聲明:我是maven-jaxb2-plugin

審核人員注意:我不打算推​​廣/宣傳我的插件,我只想提出問題的解決方案。 而且我的項目似乎提供了最好/最優雅和完整的解決方案。

此配置的問題是<schemaDirectory>需要File名/路徑。 關於File的事情是它在文件系統上查找文件,從當前工作目錄中搜索。 在這種情況下項目根。 但是項目A的資源不在項目B的src/main/resources中。它是一個類路徑資源,其中(當在maven中構建時), src/main/resources甚至不再存在。

我從來沒有嘗試過使用jaxb2-maven-plugin ,所以我不確定它是否可行。

但是使用maven-jaxb2-plugin ,它允許從Maven工件編譯模式 你可能會這樣

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.9.0</version>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <schemas>
            <schema>
                <dependencyResource>
                    <groupId>projecta.groupid</groupId>
                    <artifactId>project-a</artifactId>
                    <version>${project.version}</version>
                    <resource>/schema.xsd</resource>
                </dependencyResource>
            </schema>
        </schemas>
        <generateDirectory>src/main/gen/</generateDirectory>
        <generatePackage>mypackage</generatePackage> 
    </configuration>
</plugin>

在這種情況下,它的資源(schema.xsd)位於項目A的src/main/resources中。該插件將生成類文件到mypackage包並獲取src/main/gen

我們也可以在pom.xml文件中使用如下

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.5</version>
            <executions>
                <execution>
                    <id>id1</id>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>src/main/java</outputDirectory>
                        <clearOutputDir>false</clearOutputDir>
                        <packageName>com.subu.xsd.model</packageName>
                        <schemaDirectory>src/main/java/schemadir</schemaDirectory>
                        <schemaFiles>XYZ.xsd</schemaFiles>
                    </configuration>
                </execution>
            </executions>
        </plugin>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM