JAXBで生成されたソースを使用するmavenにマルチモジュールプロジェクトがあります:
parent
module A
module B (depends on module A)
JAXB がなければ、すべて正常にコンパイルされます。モジュール B に JAXB プラグインを追加すると、maven は次のように文句を言います。
Failed to execute goal on project moduleB: Could not resolve dependencies for
project groupId:A:jar:1.7.0: Could not find artifact groupId:A:jar:1.7.0:
in thirdparty (http://10.0.0.2:8081/nexus/content/repositories/thirdparty)
私が知る限り、これは jaxb maven プラグインが、モジュール A がコンパイルされる前に、generate-sources フェーズですべての依存関係を解決する必要があるためです。モジュール A をローカル リポジトリにインストールするメカニズムはありません。両方のモジュールが同じ git リポジトリにあるため、モジュール A は必要ありませんでした。
私が見つけた醜い解決策はこれです:
parent
module A
module B (depends on module A & C)
module C (contains only JAXB generate-sources)
JAXB はモジュール A を必要としないため、すべてがコンパイルされます。このソリューションは機能しますが、醜いです。通常、モジュールには有用なコードが含まれていますが、モジュール C に有用なコードを配置するには、同じエラーを引き起こすモジュール A に依存させる必要があります。(別の JAXB プラグインへの切り替えは機能しませんでした。これは、generate-sources フェーズで依存関係も解決されたためです。)
質問: 別のモジュールを作成せずにこの依存関係を回避する方法はありますか?
(考えられる解決策には、モジュール B のフェーズまたはスコープを追加する、モジュール B がモジュール A を必要とする依存関係のスコープを変更して、generate-sources の後まで必要としないようにする、または除外を作成して JAXB がこれを検索しないようにすることが含まれます。特定の依存関係。)
以下はすべて、pom.xml ファイルの最小限のバージョンです。これは動作中の poms から派生したものですが、現在の形式でコンパイルされるとは 100% 確信が持てません。
親/pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>artFacts</artifactId>
<groupId>com.group</groupId>
<version>1.7.0</verison>
<repositories>
<repository>
<id>thirdparty</id>
<url>http://10.0.0.2:8081/nexus/content/repositories/thirdparty</url>
</repository>
</repositories>
<modules>
<module>modA</module>
<module>modB</module>
</modules>
</project>
親/a/pom.xml:
<project>
<parent>
<artifactId>artFacts</artifactId>
<groupId>com.group</groupId>
<version>1.7.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>modA</artifactId>
<packaging>jar</packaging>
</project>
親/b/pom.xml:
<project>
<parent>
<artifactId>artFacts</artifactId>
<groupId>com.group</groupId>
<version>1.7.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>modB</artifactId>
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>1.3</version>
<executions>
<execution>
<id>xjc_raw</id>
<goals>
<goal>xjc</goal>
</goals>
<configuration>
<packageName>com.group.jaxb</packageName>
<schemaDirectory>${basedir}/xsd/</schemaDirectory>
<outputDirectory>${project.build.directory}/generated-sources/jaxb</outputDirectory>
<staleFile>${project.build.directory}/generated-sources/jaxb/.staleFlag</staleFile>
<target>2.1</target>
</configuration>
<phase>generate-sources</phase>
</execution>
</executions>
</plugin>
<!-- Tell Eclipse where to find the generated sources. -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<id>add-source</id>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>${project.build.directory}/generated-sources/jaxb</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<!-- This is the dependency which fails because it can't be resolved
during the generate-sources phase. -->
<dependency>
<groupId>com.group</groupId>
<artifactId>modA</artifactId>
<version>${project.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.1</version>
<type>jar</type>
<optional>false</optional>
</dependency>
<dependencies>
</project>
この形式では、プロジェクトは上記のエラー メッセージで失敗するはずです。これを醜いソリューションに変更するには、modC を作成し、そこに JAXB に関するすべてを配置します。この後は、modB を modA と modC の両方に依存させ、親に modC を追加するだけです。