Mavenベースのプロジェクトがあり、「jaxb2-maven-plugin」Mavenプラグインによって自動的に生成されたJAXBクラスをいくつか追加しようとしています。しかし、私の最初のカットでは、循環依存ループに陥っています。
これを解決するには、2つの明らかな可能性があるようです。
/target
から/src/main/Java
にコピーして、それらを参照してもコンパイルエラーが発生しないようにします。ここで何かが足りませんか?オプション#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の質問 を参照してください。
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
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プラグインの違い )。
たぶん 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からの答えは正しいです。どちらのプラグインもコンパイルする前にソースを生成する必要があり、ソース生成の結果はクラスパスに表示されます。私はこれを両方のプラグインでテストしました。スキーマ、または少なくともコードがクラスパスで取得できなかったタイプのスキーマを投稿することは可能ですか?