jaxb / Mavenに複数のスキーマパッケージを生成するように指示するにはどうすればよいですか?


80

例:

</plugin>       
       <plugin>
           <groupId>org.jvnet.jaxb2.maven2</groupId>
           <artifactId>maven-jaxb2-plugin</artifactId>
           <version>0.7.1</version>
           <executions>
             <execution>
               <goals>
                 <goal>generate</goal>
               </goals>
             </execution>
           </executions>
            <configuration>
             <schemaDirectory>src/main/resources/dir1</schemaDirectory>
              <schemaIncludes>
                  <include>schema1.xsd</include>
              </schemaIncludes>
              <generatePackage>schema1.package</generatePackage>
           </configuration>
         </plugin>
          <plugin>
           <groupId>org.jvnet.jaxb2.maven2</groupId>
           <artifactId>maven-jaxb2-plugin</artifactId>
           <version>0.7.1</version>
           <executions>
             <execution>
               <goals>
                 <goal>generate</goal>
               </goals>
             </execution>
           </executions>
            <configuration>
             <schemaDirectory>src/main/resources/dir2</schemaDirectory>
              <schemaIncludes>
                  <include>schema2.xsd</include>
              </schemaIncludes>
              <generatePackage>schema2.package</generatePackage>
           </configuration>
         </plugin>
       </plugins>

何が起こったのか:Mavenは最初のプラグインを実行します。次に、ターゲットフォルダーを削除し、2番目のパッケージを作成します。これが表示されます。

最初の構成にtarget / somedir1を設定し、2番目の構成にtarget / somedir2を設定しようとしました。しかし、動作は変わりませんか?何か案は?これらのパッケージは生成され、手動で作成されたクラスと混合してはならないため、src / main / javaフォルダーに直接パッケージを生成したくありません。


はい、ここでも同じ問題が発生しましたが、Pascalのソリューションはほぼ完璧に機能します。私が今必要としているのは、IDEが生成されたコードでうまく機能するようにすることです。
ニュートピアン2010年

回答:


119

別のものを指定する必要がありましたgenerateDirectory(これがないと、プラグインはファイルが最新であり、2回目の実行中に何も生成していないと見なしていました)。またtarget/generated-sources/<tool>、生成されたソースの規則に従って、お気に入りのIDEに自動的にインポートされるようにすることをお勧めします。またexecution、プラグインを2回宣言するのではなく、いくつか宣言することをお勧めします(そして、configurationexecution要素の内部を移動します)。

<plugin>
  <groupId>org.jvnet.jaxb2.maven2</groupId>
  <artifactId>maven-jaxb2-plugin</artifactId>
  <version>0.7.1</version>
  <executions>
    <execution>
      <id>schema1-generate</id>
      <goals>
        <goal>generate</goal>
      </goals>
      <configuration>
        <schemaDirectory>src/main/resources/dir1</schemaDirectory>
        <schemaIncludes>
          <include>shiporder.xsd</include>
        </schemaIncludes>
        <generatePackage>com.stackoverflow.package1</generatePackage>
        <generateDirectory>${project.build.directory}/generated-sources/xjc1</generateDirectory>
      </configuration>
    </execution>
    <execution>
      <id>schema2-generate</id>
      <goals>
        <goal>generate</goal>
      </goals>
      <configuration>
        <schemaDirectory>src/main/resources/dir2</schemaDirectory>
        <schemaIncludes>
          <include>books.xsd</include>
        </schemaIncludes>
        <generatePackage>com.stackoverflow.package2</generatePackage>
        <generateDirectory>${project.build.directory}/generated-sources/xjc2</generateDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

この設定では、次の結果が得られます。 mvn clean compile

$ツリーターゲット/
目標/
├──クラス
│├──com
││└──stackoverflow
││├──App.class
││├──package1
│││├──ObjectFactory.class
│││├──Shiporder.class
│││├──Shiporder$ Item.class
│││└──Shiporder$ Shipto.class
││└──package2
││├──BookForm.class
││├──BooksForm.class
││├──ObjectFactory.class
││└──package-info.class
│├──dir1
││└──shiporder.xsd
│└──dir2
│└──books.xsd
└──生成されたソース
    ├──xjc
    │└──META-INF
    │└──sun-jaxb.episode
    ├──xjc1
    │└──com
    │└──stackoverflow
    │└──package1
    │├──ObjectFactory.java
    │└──Shiporder.java
    └──xjc2
        └──com
            └──stackoverflow
                └──package2
                    ├──BookForm.java
                    ├──BooksForm.java
                    ├──ObjectFactory.java
                    └──package-info.java

これは期待される結果のようです。


おかげで、私は実際に昨日同じ問題を抱えていましたが、一時的にそれを操作しました。あなたの解決策はほぼ完璧に機能します。私の唯一の問題は、Eclipseをエラーなしでコンパイルできないことです。ただし、コマンドラインではすべて問題ありません。私の現在の回避策は、ターゲット内のこれらのフォルダーをソースフォルダーとして宣言することであり、すべてが良好です。それが好きか
どうかはわかり

1
Eclipseプラグインm2eclipseはビルドパスを更新します。mvc clean assembly:assemblyを使用してBeanを生成した後、[プロジェクトを右クリック]> [Maven]> [プロジェクト構成の更新]を実行すると、ビルドパスが更新されます。
MR 2010年

@Newtopian @MRのコメントを参照してください。私が言及した規則に従うと、m2eclipseがそれを行います。
Pascal Thivent 2010年

うーん、それでは、手動で行ったのと同じことを行うことがわかりましたが、今では1回か2回クリックするだけです。ソースフォルダにターゲットが表示されるのはまだ奇妙ですが、今ではほとんど無料なので、保持します:-)
Newtopian 2010年

1
私はそれが古い質問であることを知っていますが、何かが私に答えることを願っています。私はそのコードを使用し、それは機能します。ただし、同じパッケージを設定する場合は、常に1つのスキーマのみが生成されます。たとえば、最初の実行でcom.myproject.answerを設定し、2番目の実行でcom.myproject.request ..を設定し、ソースの生成後に* answerパッケージしかなく、リクエストが欠落しています...それを修正する方法はありますか?私も同じように設定したディレクトリを生成します。
デニスステファノフ2017

14

JAXBバインディングを使用して、スキーマごとに異なるパッケージを指定することもできます。

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0" schemaLocation="book.xsd">

    <jaxb:globalBindings>
        <xjc:serializable uid="1" />
    </jaxb:globalBindings>

    <jaxb:schemaBindings>
        <jaxb:package name="com.stackoverflow.book" />
    </jaxb:schemaBindings>

</jaxb:bindings>

次に、新しいmaven-jaxb2-plugin0.8.0<schemas>との<bindings>要素を使用しpom.xmlます。または、スキーマとバインディング内<schemaDirectory>およびスキーマとバインディング<bindingDirectory>によって、最上位のディレクトリを指定し<include>ます。

<schemaDirectory>src/main/resources/xsd</schemaDirectory>
<schemaIncludes>
    <include>book/*.xsd</include>
    <include>person/*.xsd</include>
</schemaIncludes>
<bindingDirectory>src/main/resources</bindingDirectory>
<bindingIncludes>
    <include>book/*.xjb</include>
    <include>person/*.xjb</include>
</bindingIncludes>

新しいXSDを追加するときに、Mavenを変更する必要がなく、同じディレクトリに新しいXJBバインディングファイルを追加するだけなので、これはより便利なソリューションだと思いますpom.xml


シンタックスハイライトのヒントを提供するための簡単な編集は、投稿の読みやすさを向上させます
Kev

OK、説明ありがとうございます。編集によって構文の強調表示が追加されたことがわかりません。
xmedeko 2012年

2
新しいスキーマが追加されるたびにpomを変更し続けたくないので、これは私にとって最良の答えです。
ベンサーリー2013

ここでの1つの問題は、本と人がxsdの同じターゲット名前空間にあるかどうかです。代わりに、本、ジャーナル、新聞などがあり、そのすべてにpublishable.xsdが含まれているとしましょう。それらは公開可能と同じ名前空間にある必要があり、したがって互いに存在する必要がありますが、名前空間ごとに1つのschemaBindingしか持てないため、これは機能しなくなります。私はそれが理想的であることに同意し、上記の例で機能することを望みますが、JAXBは十分な柔軟性がありません。
TurnipEntropy

8

これを変更して、プラグインを1回だけ定義し、実行領域を2回実行する必要があります...次のように...そしてgenerateDirectoryを設定する必要があります(ドキュメントに基づいて)。

<plugin>
  <groupId>org.jvnet.jaxb2.maven2</groupId>
  <artifactId>maven-jaxb2-plugin</artifactId>
  <version>0.7.1</version>
  <executions>
    <execution>
      <id>firstrun</id>
      <goals>
        <goal>generate</goal>
      </goals>
      <configuration>
        <generateDirectory>target/gen1</generateDirectory>
        <schemaDirectory>src/main/resources/dir1</schemaDirectory>
        <schemaIncludes>
          <include>schema1.xsd</include>
        </schemaIncludes>
        <generatePackage>schema1.package</generatePackage>
      </configuration>
    </execution>
    <execution>
      <id>secondrun</id>
      <goals>
        <goal>generate</goal>
      </goals>
      <configuration>
        <generateDirectory>target/gen2</generateDirectory>
        <schemaDirectory>src/main/resources/dir2</schemaDirectory>
        <schemaIncludes>
          <include>schema2.xsd</include>
        </schemaIncludes>
        <generatePackage>schema2.package</generatePackage>
      </configuration>
    </execution>
  </executions>
</plugin>

あなたはMavenの単一のアーティファクトルールと戦っているように見えました...これについて考える必要があるかもしれません。


モジュールごとに1つのアーティファクトルールは真ですが... OPは2つのアーティファクトを生成していません。
パスカルティベント2010年

5

これは、スキーマに古いファイル名を指定し、出力ディレクトリをクリアしないことによっても実現できます。デフォルトの出力ディレクトリはクラスパスに自動的に含まれますが、これはあまり便利ではありません。別の出力ディレクトリを指定する場合、IDEでこのコードを使用するにはクラスパスを処理する必要があります。例えば ​​-

<plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.3.1</version>
            <configuration>
                <quiet>true</quiet>
                <verbose>false</verbose>
                <clearOutputDir>false</clearOutputDir>
                <readOnly>true</readOnly>
                <arguments>-mark-generated</arguments>
            </configuration>
            <executions>
                <execution>
                    <id>reportingSchema</id>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                    <configuration>
                        <schemaDirectory>src/main/resources/schema/r17/schemaReporting</schemaDirectory>
                        <schemaIncludes>
                            <include>OCISchemaReporting.xsd</include>
                        </schemaIncludes>
                        <packageName>com.broadsoft.oci.r17.reporting</packageName>
                        <staleFile>${build.directory}/generated-sources/.jaxb-staleFlag-reporting</staleFile>
                    </configuration>
                </execution>
                <execution>
                    <id>schemaAS</id>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                    <configuration>
                        <schemaDirectory>src/main/resources/schema/r17/schemaAS</schemaDirectory>
                        <schemaIncludes>
                            <include>OCISchemaAS.xsd</include>
                        </schemaIncludes>
                        <packageName>com.broadsoft.oci.r17.as</packageName>
                        <staleFile>${build.directory}/generated-sources/.jaxb-staleFlag-as</staleFile>
                    </configuration>
                </execution>
            </executions>
        </plugin>
</plugins>

出典:JAXBプラグインを使用したコードの生成


5

私は解決しました:

                        <removeOldOutput>false</removeOldOutput>
                        <clearOutputDir>false</clearOutputDir>
                        <forceRegenerate>true</forceRegenerate>

これを各構成に追加します;)


2
<executions>タグにのみ追加することもできます。それで十分です。<removeOldOutput>デフォルトではfalseに設定されています。しかし<clearOutputDir>static.highsource.org

私にとって本当の解決策は、同じフォルダにすべてのものを生成できるからです
MilacH 2017年

<clearOutputDir>false</clearOutputDir>私の場合は十分でした。
RuwankaMadhushan20年

3

これは、プラグインのバージョン1.6で修正されています

            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.6</version>

ただし、最初の反復出力が削除されていることに気づきました。それぞれの実行に以下を追加して修正しました。

                        <removeOldOutput>false</removeOldOutput>
                        <clearOutputDir>false</clearOutputDir>

これは、各反復が正しく出力される私の完全な実例です。ところで、与えられたxsdの名前空間の重複の問題のため、これを行う必要がありました。これで私の問題は解決したようです。

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.6</version>
            <executions>
                <execution>
                    <id>submitOrderRequest</id>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                    <configuration>
                        <extension>true</extension>
                        <schemaDirectory>src/main/resources/xsd/</schemaDirectory>
                        <!-- <schemaFiles>getOrderStatusResponse.xsd,quoteShippingRequest.xsd,quoteShippingResponse.xsd,submitOrderRequest.xsd,submitOrderResponse.xsd</schemaFiles> -->
                        <schemaFiles>submitOrderRequest.xsd</schemaFiles>
                        <bindingDirectory>${project.basedir}/src/main/resources/xjb</bindingDirectory>
                        <bindingFiles>submitOrderRequest.xjb</bindingFiles>
                        <removeOldOutput>false</removeOldOutput>
                        <clearOutputDir>false</clearOutputDir>
                    </configuration>
                </execution>
                <execution>
                    <id>submitOrderResponse</id>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                    <configuration>
                        <extension>true</extension>
                        <schemaDirectory>src/main/resources/xsd/</schemaDirectory>
                        <!-- <schemaFiles>getOrderStatusResponse.xsd,quoteShippingRequest.xsd,quoteShippingResponse.xsd,submitOrderRequest.xsd,submitOrderResponse.xsd</schemaFiles> -->
                        <schemaFiles>submitOrderResponse.xsd</schemaFiles>
                        <bindingDirectory>${project.basedir}/src/main/resources/xjb</bindingDirectory>
                        <bindingFiles>submitOrderResponse.xjb</bindingFiles>
                        <removeOldOutput>false</removeOldOutput>
                        <clearOutputDir>false</clearOutputDir>
                    </configuration>
                </execution>
            </executions>

        </plugin>

2

多くの試行錯誤の末、以下は私のために働きます

<plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>jaxb2-maven-plugin</artifactId>
         <version>2.1</version>
         <executions>
            <execution>
              <id>xjc1</id>
              <goals>
                  <goal>xjc</goal>
              </goals>
             <configuration>
                <packageName>com.mycompany.clientSummary</packageName>
               <sourceType>wsdl</sourceType>
                <sources>
                <source>src/main/resources/wsdl/GetClientSummary.wsdl</source>
                </sources>
                <outputDirectory>target/generated-sources/xjb</outputDirectory>
                 <clearOutputDir>false</clearOutputDir>
            </configuration>
          </execution>

          <execution>
             <id>xjc2</id>
             <goals>
                 <goal>xjc</goal>
             </goals>
             <configuration>
                <packageName>com.mycompany.wsclient.employerProfile</packageName>
                <sourceType>wsdl</sourceType>
                <sources>
                <source>src/main/resources/wsdl/GetEmployerProfile.wsdl</source>
                </sources>
                <outputDirectory>target/generated-sources/xjb</outputDirectory>
                <clearOutputDir>false</clearOutputDir>
         </configuration>
         </execution>

         <execution>
            <id>xjc3</id>
            <goals>
                <goal>xjc</goal>
            </goals>
            <configuration>
                <packageName>com.mycompany.wsclient.producersLicenseData</packageName>
                <sourceType>wsdl</sourceType>
                <sources>
                <source>src/main/resources/wsdl/GetProducersLicenseData.wsdl</source>
                </sources>
                <outputDirectory>target/generated-sources/xjb</outputDirectory>
                <clearOutputDir>false</clearOutputDir>
            </configuration>
        </execution>


     </executions>
  </plugin>

2

Mavenでjaxbを使用しているときに多くの問題が発生しましたが、次のようにして問題を解決することができました。

最初にschema.xjcファイルを作成します

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               jaxb:version="2.0">
    <jaxb:bindings schemaLocation="YOUR_URL?wsdl#types?schema1">
        <jaxb:schemaBindings>
            <jaxb:package name="your.package.name.schema1"/>
        </jaxb:schemaBindings>
    </jaxb:bindings>
    <jaxb:bindings schemaLocation="YOUR_URL??wsdl#types?schema2">
        <jaxb:schemaBindings>
            <jaxb:package name="your.package.name.schema2"/>
        </jaxb:schemaBindings>
    </jaxb:bindings>
</jaxb:bindings>

パッケージ名は、Javaで予約されたキーワードが含まれていない限り、任意の名前にすることができます。

次に、wsimport.batスクリプトを作成して、パッケージとコードを希望の場所に生成する必要があります。

cd C:\YOUR\PATH\TO\PLACE\THE\PACKAGES
wsimport -keep -verbose -b "C:\YOUR\PATH\TO\schema.xjb" YOUR_URL?wsdl
pause

cdを使用したくない場合は、wsimport.batを「C:\ YOUR \ PATH \ TO \ PLACE \ THE \ PACKAGES」に配置できます。

-keep -verboseを指定せずに実行すると、パッケージのみが生成され、.javaファイルは生成されません。

-bは、生成時にschema.xjcが使用されていることを確認します


0

これに対するもう1つの明確な(IMO)ソリューションがあります。「staleFile」と呼ばれるパラメーターがあり、これをフラグとして使用して、データを再度生成しないようにします。実行ごとに変更するだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.