web-dev-qa-db-ja.com

MavenプロジェクトでJAXBによって生成されたクラスを管理する

Mavenベースのプロジェクトがあり、「jaxb2-maven-plugin」Mavenプラグインによって自動的に生成されたJAXBクラスをいくつか追加しようとしています。しかし、私の最初のカットでは、循環依存ループに陥っています。

  • これらのJAXBクラスはまだ生成されていないため、それらを参照する他のソースにはコンパイルエラーがあります。
  • これらの他のソースにはコンパイルエラーがあるため、これらのJAXBクラスは生成されません。

これを解決するには、2つの明らかな可能性があるようです。

  1. 壊れた参照をコメントアウトして、プロジェクトがビルドされ、JAXBクラスが自動的に生成されるようにします。次に、生成されたソースを/targetから/src/main/Javaにコピーして、それらを参照してもコンパイルエラーが発生しないようにします。
  2. JAXBのものだけで構成される完全に別個のプロジェクトを作成します。それを依存関係として私のメインプロジェクトに含めます。

ここで何かが足りませんか?オプション#1はまったくばかげているようです...の方法ではありませんJAXBを使用している人。オプション#2はより合理的であるように見えますが、それでもかなり非効率的で面倒です。 JAXBを使用するためだけに、まったく別のプロジェクトのオーバーヘッドを実際に引き受ける必要がありますか?

Mavenプラグインがクラスを生成するのと同じプロジェクトで開発者がJAXBで生成されたクラスを参照するために使用するより洗練されたアプローチはありますか?

UPDATE:リクエストにより、これが私のPOMの関連部分です:

<build>
    <plugins>
        <plugin>
            <!-- configure the compiler to compile to Java 1.6 -->
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>       
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.4</version>
            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <!-- The name of your generated source package -->
                <packageName>com.mypackage</packageName> 
            </configuration>
        </plugin>
    </plugins>  
</build>

mvn clean packageを実行すると、JAXBソースが/targetサブディレクトリの下に生成されているのがわかります。ただし、これらの生成されたソースは、コンパイルフェーズのクラスパスに自動的に追加されません。

POST-RESOLUTION UPDATE:コンパイルの問題は、Eclipseで実行していたという事実と関係があり、Maven統合にはいくつかの問題があります。 「jaxb2-maven-plugin」に関する問題。その問題とその解決策の詳細については、 このStackOverflowの質問 を参照してください。

11
Steve Perkins

jaxbで生成されたクラス(api)とBLクラス(実装)を、それぞれに個別のpom.xmlを持つ2つのmavenプロジェクトと、コンパイル順序を持つメインルートpom.xmlに分割することをお勧めします。そうすれば、api.jarをビルドして、mavenがローカルリポジトリ内にインストールし、その後、実装の依存関係として使用できるようになります。したがって、次のようになります。

-API\
--pom.xml - for api, jaxb generation
-IMPL\
--pom.xml - for impl, api dependency is here
pom.xml - main pom.xml with references to the projects above
7
Denis Zevakhin

Jaxb mavenプラグインをどのように構成しましたか?通常、コンパイルライフサイクルの前にあるソース生成ライフサイクルで実行されます。したがって、JAXBで生成されたクラスは、独自のコードがコンパイルされたときにすでに存在しているはずです。Mavenはそれらをtarget/generate-sourceに配置し、そのフォルダーをクラスパスに配置します。

編集:これは私たちが仕事で使用しているコードです(そして期待どおりに機能します):

<plugin>
            <groupId>com.Sun.tools.xjc.maven2</groupId>
            <artifactId>maven-jaxb-plugin</artifactId>
            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <schemaDirectory>src/main/resources/<companyname>/xsd</schemaDirectory>
                <includeSchemas>
                    <includeSchema>retrieval.xsd</includeSchema>
                    <includeSchema>storage.xsd</includeSchema>
                </includeSchemas>
            </configuration>
        </plugin>

どうやら私たちはさらに別のjaxbプラグインを使用しています...(このスレッドも参照してください: Maven JAXBプラグインの違い )。

9

たぶん maven-jaxb2-plugin 代わりに:

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.8.2</version>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
</plugin>

しかし、dfuseからの答えは正しいです。どちらのプラグインもコンパイルする前にソースを生成する必要があり、ソース生成の結果はクラスパスに表示されます。私はこれを両方のプラグインでテストしました。スキーマ、または少なくともコードがクラスパスで取得できなかったタイプのスキーマを投稿することは可能ですか?

3
davidfmatheson