2

プロジェクトを Maven 2.2.1 から Maven 3.0.4 にアップグレードしようとしていますが、依存関係の解決で問題が発生しています。Mavenのドキュメントや同様の投稿を調べて、これを調査するために丸1日を費やしましたが、まだ立ち往生しています。これはスタックオーバーフローに関する私の最初の質問なので、ここでエチケットを十分に守っていることを願っています. ご協力いただきありがとうございます!

私のプロジェクト構造は次のとおりです。

pom.xml (acme-parent)
child-alpha
+-----> pom.xml

さらに、自分のリポジトリに次のファイルがあります。

http://maven.my-own-repo.com/acme/child-dep-jdk15/maven-metadata-local.xml
http://maven.my-own-repo.com/acme/child-dep-jdk15/1.0/child-dep-jdk15-1.0.jar
http://maven.my-own-repo.com/acme/child-dep-jdk15/1.0/child-dep-jdk15-1.0.pom

child-alpha/pom.xml には、自分の acme:child-dep-jdk15 へのプロファイル依存関係があり、これは個別に jar ファイルに組み込まれており、同じ acme-parent である親を指定する独自の .pom ファイルがあります。子アルファとしての親。

関連ファイルからの抜粋を次に示します。

acme 親 pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>acme</groupId>
    <artifactId>acme-parent</artifactId>
    <name>Acme Parent Project</name>
    <version>1</version>
    <packaging>pom</packaging>

    <properties>...</properties>

    <modules>
        <module>child-alpha</module>
    </modules>

    <repositories>
        <repository>
            <id>acme-repo</id>
            <url>http://maven.my-own-repo.com</url>
        </repository>
        <repository>
            <id>central</id>
            <url>http://repo1.maven.org/maven2</url>
        </repository>
    </repositories>

    <pluginRepositories>...</pluginRepositories>

    <build>
      <plugins>...</plugins>
    </build>

    <dependencies>...</dependencies>
</project>

子アルファ pom.xml:

<project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>acme</groupId>
        <artifactId>acme-parent</artifactId>
        <version>1</version>
    </parent>
    <artifactId>child-alpha</artifactId>
    <name>Child Alpha Project</name>
    <version>1.0</version>
    <packaging>jar</packaging>

    <scm>...</scm>

    <properties>...</properties>

    <build>
      <resources>...</resources>
      <plugins>...</plugins>
    </build>

    <profiles>
        <profile>
            <id>jdk15</id>
            <activation>
                <activeByDefault>true</activeByDefault>
                <jdk>1.5</jdk>
            </activation>
            <dependencies>
                <dependency>
                    <groupId>acme</groupId>
                    <artifactId>child-dep-jdk15</artifactId>
                    <version>1.0</version>
                </dependency>
            </dependencies>
        </profile>
    </profiles>

    <dependencies>...</dependencies>
</project>

子 dep-jdk15-1.0.pom:

<project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>acme</groupId>
        <artifactId>acme-parent</artifactId>
        <version>1</version>
    </parent>
    <groupId>acme</groupId>
    <artifactId>child-dep-jdk15</artifactId>
    <name>Acme Child Dependency</name>
    <version>1.0</version>
    <packaging>jar</packaging>

    <build>...</build>

    <dependencies>...</dependencies>
</project>

child-alpha を (child-alpha ディレクトリで) ビルドしようとしたときに、次のコマンドを実行しました。

mvn -U -e clean install

そして、次のログ メッセージとスタック トレースを取得しました (不要なメッセージは削除されました)。

Downloading: http://maven2.my-own-repo.com/acme/acme-parent/1/acme-parent-1.pom
Downloading: http://repo1.maven.org/maven2/acme/acme-parent/1/acme-parent-1.pom

[...]

[ERROR] Failed to execute goal on project child-alpha: Could not resolve dependencies for project acme:child-alpha:jar:1.0: [...]

Caused by: org.apache.maven.project.DependencyResolutionException: Could not resolve dependencies for project acme:child-alpha:jar:1.0: [...]

Caused by: org.sonatype.aether.collection.DependencyCollectionException: Failed to collect dependencies for [...]
    at org.sonatype.aether.impl.internal.DefaultDependencyCollector.collectDependencies(DefaultDependencyCollector.java:258)
    at org.sonatype.aether.impl.internal.DefaultRepositorySystem.collectDependencies(DefaultRepositorySystem.java:308)
    at org.apache.maven.project.DefaultProjectDependenciesResolver.resolve(DefaultProjectDependenciesResolver.java:150)
    ... 23 more
Caused by: org.sonatype.aether.resolution.ArtifactDescriptorException: Failed to read artifact descriptor for acme:child-dep-jdk15:jar:1.0
    at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:331)
    at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.readArtifactDescriptor(DefaultArtifactDescriptorReader.java:186)
    at org.sonatype.aether.impl.internal.DefaultDependencyCollector.process(DefaultDependencyCollector.java:412)
    at org.sonatype.aether.impl.internal.DefaultDependencyCollector.collectDependencies(DefaultDependencyCollector.java:240)
    ... 25 more
Caused by: org.apache.maven.model.resolution.UnresolvableModelException: Could not find artifact acme:acme-parent:pom:1 in acme-repo (http://maven.my-own-repo.com)
    at org.apache.maven.repository.internal.DefaultModelResolver.resolveModel(DefaultModelResolver.java:126)
    at org.apache.maven.model.building.DefaultModelBuilder.readParentExternally(DefaultModelBuilder.java:813)
    at org.apache.maven.model.building.DefaultModelBuilder.readParent(DefaultModelBuilder.java:664)
    at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:310)
    at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:232)
    at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:322)
    ... 28 more
Caused by: org.sonatype.aether.resolution.ArtifactResolutionException: Could not find artifact acme:acme-parent:pom:1 in acme-repo (http://maven.my-own-repo.com)
    at org.sonatype.aether.impl.internal.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:538)
    at org.sonatype.aether.impl.internal.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:216)
    at org.sonatype.aether.impl.internal.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:193)
    at org.apache.maven.repository.internal.DefaultModelResolver.resolveModel(DefaultModelResolver.java:122)
    ... 33 more
Caused by: org.sonatype.aether.transfer.ArtifactNotFoundException: Could not find artifact acme:acme-parent:pom:1 in acme-repo (http://maven.my-own-repo.com)
    at org.sonatype.aether.connector.wagon.WagonRepositoryConnector$4.wrap(WagonRepositoryConnector.java:947)
    at org.sonatype.aether.connector.wagon.WagonRepositoryConnector$4.wrap(WagonRepositoryConnector.java:941)
    at org.sonatype.aether.connector.wagon.WagonRepositoryConnector$GetTask.run(WagonRepositoryConnector.java:669)
    at org.sonatype.aether.util.concurrency.RunnableErrorForwarder$1.run(RunnableErrorForwarder.java:60)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:680)

Maven 2 を使用している間、http://maven2.my-own-repo.com/acme/acme-parent/1/acme-parent-1 の場所にある acme-parent pom.xml は必要ありませんでした 。ポンポン

独自のレポに親の pom.xml がない理由は、バージョン管理ブランチを作成するときに使用するスクリプトがあり、現在のブランチに応じて acme-parent pom.xml の値を変更するためです。その pom.xml をリポジトリに配置し、継続的インテグレーション サーバーと同時に構築しようとしているさまざまなブランチすべてに対して正しく更新し続けるのは複雑です。

Maven 2 では、child-alpha のビルドを行う場合、Maven は acme-parent pom.xml を 1 つ上のディレクトリ、つまり ../pom.xml の相対パスで問題なく見つけることができるため、私のリポジトリに移動しようとすることはありません。それを見つけるために。親 pom.xml をローカル チェックアウトにのみ配置し、リポジトリに配置しないと、Maven 2 で正常に機能しました。

しかし、Maven 3.0.4 で child-alpha をビルドしようとすると、上記の例外が発生しました。最初は、child-alpha の pom.xml の上部にあるタグ内に relativePath を明示的に設定する必要があると思っていましたが、それでも問題は解決しませんでした。実際、acme-parent の pom.xml は、実際には既にデフォルトの relativePath の中にあります。 ../pom.xml であるため、明示的に設定する必要はありません。

次に、child-alpha の pom.xml のセクション内の child-dep-jdk15 依存関係をコメントアウトしてみました。child-alpha maven ビルドは、この依存関係をコメントアウトして正常に完了します。

child-dep-jdk15 依存関係がある場合に、なぜ child-alpha が Maven 3 でビルドされないのか理解できません。Maven が最初に (上部のブロックごとに) acme-parent pom.xml を正しく見つけることができた場合、child-dep-jdk15 依存関係を処理するときにリポジトリからダウンロードしようとするのはなぜですか? 何かを誤って構成したことがありますか?もしそうなら、どうすれば修正できますか?

もう 1 つ: 最初mvn -N installに acme-parent の pom.xml と同じディレクトリで実行し、次に child-alpha をビルドしようとすると、コードに依存関係の child-dep-jdk15 を保持していても、child-alpha のビルドは成功します。このコマンドを実行すると、acme-parent-1.pom がローカルの .m2 ディレクトリにあることを確認できます。この回避策は個々の開発者にとっては問題ないかもしれませんが、異なるブランチの同時ビルドを実行できる必要がある継続的インテグレーション サーバーにとっては問題になります。

上記のバージョン管理分岐の変更により、 acme-parent pom.xml をホストするようにリポジトリを再構成する必要はありません。

4

1 に答える 1