10

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

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

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

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

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

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

更新: リクエストに応じて、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サブディレクトリの下に生成されていることがわかります。ただし、これらの生成されたソースは、コンパイル フェーズのクラスパスに自動的に追加されません。

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

4

3 に答える 3

9

jaxb maven プラグインをどのように構成しましたか? 通常は、コンパイル ライフサイクルの前に発生する、ソース生成ライフサイクルで実行されます。そのため、独自のコードがコンパイルされると、JAXB で生成されたクラスが既に存在しているはずです。Maven はそれらを target/ generated-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 プラグインの違い)。

于 2012-08-15T15:21:20.803 に答える
6

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
于 2012-08-15T19:15:21.897 に答える
3

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 からの回答は正しいです。どちらのプラグインもコンパイル前にソースを生成する必要があり、ソース生成の結果はクラスパス上にあります。これを両方のプラグインでテストしました。スキーマ、または少なくともコードがクラスパスで取得できないタイプのスキーマを投稿することは可能ですか?

于 2012-08-15T18:21:39.727 に答える