9

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 を追加するだけです。

4

0 に答える 0