web-dev-qa-db-ja.com

Mavenリリースプラグインが失敗する:ソースアーティファクトが2回展開される

Hudsonでmavenリリースプラグインを使用し、リリースプロセスを自動化しようとしています。 release:prepareは正常に機能します。 release:performを実行しようとすると、ソースアーティファクトをリポジトリに2回アップロードしようとするため失敗します。

試したこと、

  1. スーパーPOMからMavenソースプラグインを含むプロファイルを削除する(機能しませんでした)
  2. hudsonのリリースの目標を-P!attach-source release:prepare release:performとして指定します。私は、ソースプラグインが実行されないように除外すると考えました。 (動作しませんでした)。
  3. プラグインフェーズをスーパーPOMの存在しないフェーズに指定しようとしました。(機能しませんでした)
  4. プラグイン構成forReleaseProfileをfalseとして指定しようとしました。 (何だと思う??うまくいかなかった)

それでもこのエラーは発生します。

[INFO] [DEBUG] Using Wagon implementation lightweight from default mapping for protocol http
[INFO] [DEBUG] Using Wagon implementation lightweight from default mapping for protocol http
[INFO] [DEBUG] Checking for pre-existing User-Agent configuration.
[INFO] [DEBUG] Adding User-Agent configuration.
[INFO] [DEBUG] not adding permissions to wagon connection
[INFO] Uploading: http://xx.xx.xx.xx:8081/nexus/content/repositories/releases//com/yyy/xxx/hhh/hhh-hhh/1.9.40/hhh-hhh-1.9.40-sources.jar
[INFO] 57K uploaded  (xxx-xxx-1.9.40-sources.jar)
[INFO] [DEBUG] Using Wagon implementation lightweight from default mapping for protocol http
[INFO] [DEBUG] Using Wagon implementation lightweight from default mapping for protocol http
[INFO] [DEBUG] Checking for pre-existing User-Agent configuration.
[INFO] [DEBUG] Adding User-Agent configuration.
[INFO] [DEBUG] not adding permissions to wagon connection
[INFO] Uploading: http://xx.xxx.xx.xx:8081/nexus/content/repositories/releases//com/xxx/xxxx/xxx/xxx-xxx/1.9.40/xxx-xxx-1.9.40-sources.jar
[INFO] [DEBUG] Using Wagon implementation lightweight from default mapping for protocol http
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [ERROR] BUILD ERROR
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] Error deploying artifact: Authorization failed: Access denied to: http://xx.xxx.xx.xx:8081/nexus/content/repositories/releases/com/xxx/xxx/xxx/xxx-config/1.9.40/xxx-xxx-1.9.40-sources.jar

これに関するヘルプは本当にありがたいです。

mvn -Prelease-profile help:effective-pomを実行してみてください。 maven-source-pluginの実行セクションが2つあることがわかります。

出力は次のようになります。

    <plugin>
      <artifactId>maven-source-plugin</artifactId>
      <version>2.0.4</version>
      <executions>
        <execution>
          <id>attach-sources</id>
          <goals>
            <goal>jar</goal>
          </goals>
        </execution>
        <execution>
          <goals>
            <goal>jar</goal>
          </goals>
        </execution>
      </executions>
    </plugin>

この問題を解決するには、maven-source-pluginを使用したすべての場所を見つけ、リリースプロファイルと同じになるように "id" attach-sourcesを使用するようにしてください。次に、これらのセクションがマージされます。

一貫性を得るためには、ビルド> pluginManagementおよび[〜#〜] not [〜#〜]でプロジェクトのルートPOMでこれを構成する必要があるとベストプラクティスに記載されています。子pomでは、build> pluginsでmaven-source-pluginを使用するように指定するだけですが、実行は提供しません。

ルームpom.xmlで:

<build>
  <pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <executions>
          <execution>
            <!-- This id must match the -Prelease-profile id value or else sources will be "uploaded" twice, which causes Nexus to fail -->
            <id>attach-sources</id>
            <goals>
              <goal>jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>    
  </pluginManagement>
</build>

子pom.xmlで:

<build>
  <plugins>
    <plugin>
      <groupId>org.Apache.maven.plugins</groupId>
      <artifactId>maven-source-plugin</artifactId>
    </plugin>
  </plugins>
</build>
66
Bae

私はこの質問が古いことを知っていますが、今日はグーグルヒット#1だったので、Maven 3の最近のバージョンに適切な答えを追加します。

症状は、Maven 3の一部のバージョンでリリースビルドを実行するときに、ソースとjavadoc jarが2回展開されることです。完全に合理的な動作です)、2回目のアップロード試行が拒否されるとビルドは失敗します。ああ!

Mavenバージョン3.2.3から3.3.9にはバグがあります- https://issues.Apache.org/jira/browse/MNG-5868 および https://issues.Apacheを参照してください。 org/jira/browse/MNG-5939 。これらのバージョンは、リリース時にソースとjavadoc jarを2回生成およびデプロイします。

Maven課題トラッカーを正しく読んだ場合、これらのバグはこの執筆時点で修正される予定はありません(焼き付けられた3.4.0リリースがおそらくこれらに影響しました)。

私のPOMを複雑に調整する代わりに、私の簡単な回避策はMavenバージョン3.2.1にフォールバックすることでした。

24
chrisinmtown

同じ問題が発生しただけで、少し分析しました。 mvn release:performはrelease.propertiesファイルを評価してから、一時ディレクトリ内のタグをチェックアウトし、次のように呼び出します

/usr/bin/mvn -D maven.repo.local=... -s /tmp/release-settings5747060794.xml
    -D performRelease=true -P set-envs,maven,set-envs deploy

私はこれを再現しようとしました-release:prepareによって生成されたタグを手動でチェックアウトし、これを呼び出しました:

mvn -D performRelease=true -P set-envs,maven,set-envs deploy

同じ結果が得られました:-sources.jarを2回アップロードしようとしていました。

コメントで qualidafial で示されているように、performRelease=falseを設定すると、代わりに同じファイルの2つの添付ファイルの1つが省略されます。

deploy plugin (または他のプラグイン)がこのプロパティをどのように使用するのか、私には本当に分かりません。

このパラメーターを構成としてmaven-relase-pluginに提供できます。

<build>
    <plugins>
         <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-release-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <useReleaseProfile>false</useReleaseProfile>
            </configuration>
        </plugin>
    </plugins>
</build>

<useReleaseProfile>false</useReleaseProfile>行をすべてのPOMに追加しましたが、エラーメッセージなしでリリースできるようになりました。

7
Paŭlo Ebermann

私はこの問題にしばらく苦労してきましたが、ようやくインフラストラクチャで解決できるようになりました。ここでの回答は、ソースプラグインの目標を複数回実行することはなく、構成は問題ないように思えたので、私を助けませんでした。

逃したのは、ソースプラグインの実行をフェーズにバインドすることでした。行<phase> install </ phase>を含むサンプルをBaeによって拡張して、問題を解決しました。

<plugin> <artifactId>maven-source-plugin</artifactId> <version>2.0.4</version> <executions> <execution> <id>attach-sources</id> <phase>install</phase> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin>

解決策はこの答えにあると思う here ;さまざまなプラグインがjarゴール/ attach-sourcesの実行を呼び出しているようです。実行を特定のフェーズにバインドすることにより、このフェーズでのみプラグインが実行されるようにします。

3
Tobi Nonymous

実行中に私にこれが起こっていた

mvn install deploy

代わりに実行することで問題を回避しました

mvn deploy

(これはインストールを意味します)。私の場合、2回アップロードしようとするアーティファクトは1つだけであり、それはセカンダリアーティファクトでした(maven-jar-pluginは、default-jarの実行によってビルドされたものに加えてセカンダリjarをビルドするようにセットアップされました)。

0
EricS

私はprobemがリリースプラグインにあるとは思わない、あなたは_xxx-sources.jar_を2回添付していると思う-それが重複アップロードの理由です。重複した添付ファイルがあるのは、POMを確認せずに見分けるのが難しいのはなぜですか。 _mvn -X_を実行して、もう一度_xxx-source.jar_をアタッチしたユーザーのログを確認してください。

いずれの場合でも、Nexusでの適切な回避策は、リリースを数回アップロードできるステージングリポジトリを用意することです。すべての準備が整ったら、ステージングリポジトリを閉じる/プロモートします。例については、 Sonatype OSS setup を確認してください。

0
lexicore

FWIWこの問題はしばらくの間私たちのビルドを壊していました、そして答えは上記のどれでもありませんでした。代わりに、メインアーティファクトにアタッチ(展開、リリース)されるアーティファクトのmaven-Assembly-pluginで、一見無害なappendAssemblyIdをfalseに愚かに設定しました。例えば。:

    <execution>
        <id>ci-groovy-distrib</id>
        <phase>package</phase>
        <goals>
            <goal>single</goal>
        </goals>
        <configuration>
            <descriptorRefs>
                <descriptorRef>my-extra-Assembly</descriptorRef>
            </descriptorRefs>

            <!-- This is the BUG: the assemblyID MUST be appended 
                 because it is the classifier that distinguishes 
                 this attached artifact from the main one!
            -->
            <appendAssemblyId>false</appendAssemblyId>
            <!-- NOTE: Changes the name of the Zip in the build target directory
                       but NOT the artifact that gets installed, deployed, releaseed -->
            <finalName>my-extra-Assembly-${project.version}</finalName>
        </configuration>
    </execution>

要約すれば:

  1. assemblyプラグインは、AssemblyIdをアーティファクトのclassifierとして使用するため、Mavenの用語での固有のGAV座標の本質的な部分です(実際には、GAVC座標に似ています-Cは分類子です) 。

  2. ファイルの名前installeddeployed、またはreleasedは実際にビルドされますこれらの座標から。それは、ターゲットディレクトリに表示されるファイル名とは異なります。これがローカルビルドの見た目が良いのに、リリースが失敗する理由です。

  3. Stupid要素は、ローカルビルドアーティファクト名のみを決定し、残りの部分には関与しません。それは完全な赤ニシンです。

概要の要約:Nexusからの400エラーは、追加のアーティファクトがメインアーティファクトの上にアップロードされたためです。 、メインのアーティファクトと同じ名前であるため、メインのアーティファクトと同じGAVC座標を持つため、唯一の識別座標を削除したため:分類子はassemblyIdから自動的に派生しました。

これを見つけるための調査は、長くて曲がりくねった道でした。maven-Assemblyのドキュメントでは、答えはずっとそこにありました。

appendAssemblyId

  • ブール値

  • アセンブリの最終名からアセンブリIDを除外し、分類子なしで結果のアセンブリ成果物を作成するには、falseに設定します。 そのため、現在のMavenプロジェクトのパッケージと同じ形式のアセンブリアーティファクトは、このメインプロジェクトアーティファクトのファイルを置き換えます

  • デフォルト値はtrueです。
  • ユーザープロパティはAssembly.appendAssemblyIdです。

から http://maven.Apache.org/plugins/maven-Assembly-plugin/single-mojo.html#attach

余分な太字は私のものです。ドキュメントには、大きな点滅警告があります:「これをfalseに設定し、すべての希望を捨てる」

別の問題についてのこの回答から助けを得ました maven-Assembly-plugin:appendAssemblyIdの使用方法 tunakiからの説明は本当に役に立ちました。

0
Rhubarb

同じ問題がありました。基本的に、アーティファクトがNexusに2回送信されると、エラーメッセージが発行されます。これは、同じNexusリポジトリに対して2回、または同じNexus内の異なるリポジトリに対しても2回行われます。

ただし、このような誤設定の理由は異なる場合があります。私の場合、アーティファクトはJenkinsのmvn clean deployビルドステップ中に正しくアップロードされましたが、2回目のデプロイが試行されたときに失敗しました。この2回目のデプロイは、Jenkinsのビルド後の手順「Mavenリポジトリでアーティファクトを公開する」で設定されていました。

0
not2savvy

親と子のpomsのMavenプラグインは実行されません。標準の規則に従って、プラグイン管理セクションの親pomで実行/目標を持つすべてのプラグインを定義します。子pomは上記の詳細を再定義するべきではありませんが、実行する必要のあるプラグイン(artifactIdおよびバージョン付き)のみに言及する必要があります。

私は以下のように親pomでmaven-Assembly-pluginで同様の問題がありました:

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <artifactId>maven-Assembly-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <descriptors>
                        <descriptor>src/Assembly/assembly.xml</descriptor>
                    </descriptors>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

そして、チャイルドポンには以下のようなmaven-Assembly-pluginがありました。

<build>
    <plugins>
        <plugin>
            <artifactId>maven-Assembly-plugin</artifactId>
            <version>2.2-beta-5</version>
            <configuration>
                <finalName>xyz</finalName>
                <descriptors>
                    <descriptor>src/Assembly/assembly.xml</descriptor>
                </descriptors>
            </configuration>
            <executions>
                <execution>
                    <id>xyz-distribution</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

<executions>を子pomから削除すると、問題が修正されました。有効なPOMは2回実行され、Nexusリポジトリへの重複インストールが発生しました。

0
Anamika