java - maven release plugin branch




Maven發布插件失敗:源工件被部署兩次 (6)

我們正在使用hudson上的maven發布插件並嘗試自動執行發布過程。 發布:準備工作正常。 當我們嘗試執行release:perform時,它會失敗,因為它會嘗試將源工件兩次上傳到存儲庫。

我試過的東西,

  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

任何有關這方面的幫助將非常感激。


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. 程序集插件使用assemblyId作為工件的分類器 ,因此它是maven術語中唯一的GAV坐標的一個重要部分(實際上它更像是GAVC坐標 - C是分類器)。

  2. 安裝部署發布的文件的名稱實際上是從這些坐標構建的。 它與您在目標目錄中看到的文件名不同 。 這就是為什麼你的本地版本看起來不錯,但你的發布會失敗。

  3. stupid元素僅確定本地構建工件名稱,並且不會在其餘部分中起作用。 這是一個完整的紅鯡魚。

摘要摘要: 來自Nexus的400錯誤是因為我們的額外附加工件被上傳到主工件的頂部,因為它與主工件具有相同的名稱,因為它具有與主工件相同的GAVC坐標,因為我刪除了唯一的區別坐標:自動從assemblyId派生的分類器。

調查發現這是一個漫長而曲折的道路,答案就在麥克風集會的文檔中一直存在:

appendAssemblyId

  • 布爾

  • 設置為false以從程序集最終名稱中排除程序集ID,並創建不帶分類器的結果程序集工件。 因此,具有與當前Maven項目的打包相同格式的裝配工件將替換此主項目工件的文件

  • 默認值為:true。
  • 用戶屬性是:assembly.appendAssemblyId。

來自http://maven.apache.org/plugins/maven-assembly-plugin/single-mojo.html#attach

額外的大膽是我的。 這裡的文檔應該有一個大閃爍的警告:“將此設置為假並放棄所有希望”

我從這個答案得到了一些關於maven-assembly-plugin的不同問題的幫助:如何使用appendAssemblyId來自tunaki的解釋確實有幫助。


剛剛遇到同樣的問題,我對它進行了一些分析。 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的標籤release:prepare並調用它:

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

我得到了相同的結果:它試圖上傳-sources.jar兩次。

正如註釋中的qualidafial所述,設置performRelease=false而不是省略同一文件的兩個附件之一。

我真的不知道部署插件 (或任何其他插件)如何使用此屬性。

我們可以將此參數作為配置提供給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中,看起來現在發布沒有錯誤消息。


我不認為探測器在發布插件中,我認為你已經連接了兩次xxx-sources.jar - 這就是重複上傳的原因。 如果沒有看到POM,為什麼有重複的附件很難說。 嘗試運行mvn -X並檢查其他人附加xxx-source.jar的日誌。

在任何情況下,Nexus的一個很好的解決方法是擁有一個暫存存儲庫,您可以在其中多次上傳版本 - 當一切準備就緒時,您只需關閉/推廣暫存存儲庫。 檢查Sonatype OSS設置以獲取示例。


我使用releaseProfile = false配置了maven release插件,並且不執行源工件配置文件。 哪個做了伎倆。

<build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-release-plugin</artifactId>
                    <version>2.1</version>
                    <configuration>
                            <arguments>-P!source-artifacts</arguments>
                            <useReleaseProfile>false</useReleaseProfile>
                            <goals>-Dmaven.test.skip=true deploy</goals>
                    </configuration>    
                </plugin>
            </plugins>
        </build>

我有同樣的問題。 基本上,當工件被發送到Nexus兩次時會發出錯誤消息。 這可能是同一個Nexus存儲庫的兩倍,甚至可能是同一個Nexus中不同存儲庫的兩倍。

但是,這種錯誤配置的原因可能會有所不同。 就我而言,在Jenkins的mvn clean deploy構建步驟中正確上載了工件,但是在嘗試第二次部署時失敗了。 第二次部署是在Jenkins post構建步驟“在Maven存儲庫中發布工件”中配置的。


我知道這個問題已經過時了,但谷歌今天打了#1,所以我會添加適合最近版本的maven 3的答案。

症狀是在使用某些版本的maven 3進行發布構建時,源和javadoc jar被部署兩次。如果您使用maven將工件部署到Sonatype Nexus存儲庫,該存儲庫只允許上傳一次發布工件(是完全合理的行為),當第二次上傳嘗試被拒絕時,構建失敗。 哎呀!

Maven版本3.2.3至3.3.9有錯誤 - 請參閱https://issues.apache.org/jira/browse/MNG-5868https://issues.apache.org/jira/browse/MNG-5939 。 這些版本在執行發佈時會生成並部署兩次源和javadoc jar。

如果我正確地閱讀了Maven問題跟踪器,那麼在編寫本文時這些錯誤都沒有安排修復(燒毀的3.4.0版本可能會影響這些)。

我的簡單解決方法是回到Maven版本3.2.1,而不是對我的pom進行複雜的調整。