2011-06-09 161 views
6

我有我們的項目所必需的第三方jar。它在中央maven倉庫中不可用,所以我使用maven-install-plugin在構建期間在本地安裝jar。我將「安裝文件」目標與「驗證」階段綁定在一起,而這主要起作用。 pom.xml文件摘錄低於:mvn清潔沒有依賴關係

<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/maven-v4_0_0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
... 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-install-plugin</artifactId> 
      <version>2.3</version> 
      <executions> 
       <execution> 
        <id>install-myartifact</id> 
        <phase>validate</phase> 
        <goals> 
         <goal>install-file</goal> 
        </goals> 
        <configuration> 
         <file>${basedir}/lib/myartifact-1.2.3.jar</file> 
         <groupId>com.example</groupId> 
         <artifactId>myartifact</artifactId> 
         <version>1.2.3</version> 
         <packaging>jar</packaging> 
         <generatePom>true</generatePom> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 
<dependencies> 
    <dependency> 
     <groupId>com.example</groupId> 
     <artifactId>myartifact</artifactId> 
     <version>1.2.3</version> 
    </dependency> 
</dependencies> 

但是,這裏有一個問題。我們的大多數開發人員和我們的Jenkins安裝都運行「mvn clean install」。 「驗證」階段不是「乾淨」生命週期的一部分,乾淨地莫名其妙地需要所有依賴關係存在才能運行。所以有人第一次運行這個版本,它不起作用。

[INFO] Scanning for projects... 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building MyModule 
[INFO] task-segment: [clean, install] 
[INFO] ------------------------------------------------------------------------ 
[INFO] [clean:clean] 
[INFO] Deleting directory C:\svn\trunk\mymodule\target 
Downloading: http://nexusserver.local:8080/nexus/content/groups/public/com/example/myartifact-1.2.3.pom 
[INFO] Unable to find resource 'com.example:myartifact:pom:1.2.3' in repository central (http://central) 
[INFO] ------------------------------------------------------------------------ 
[ERROR] BUILD ERROR 
[INFO] ------------------------------------------------------------------------ 
[INFO] Failed to resolve artifact. 

Missing: 
---------- 
1) com.example:myartifact:jar:1.2.3 

    Try downloading the file manually from the project website. 

    Then, install it using the command: 
     mvn install:install-file -DgroupId=com.example -DartifactId=myartifact -Dversion=1.2.3 -Dpackaging=jar -Dfile=/path/to/file 

    Alternatively, if you host your own repository you can deploy the file there: 
     mvn deploy:deploy-file -DgroupId=com.example -DartifactId=myartifact -Dversion=1.2.3 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id] 

    Path to dependency: 
    1) com.example:mymodule:war:0.0.1-SNAPSHOT 
    2) com.example:myartifact:jar:1.2.3 

---------- 
1 required artifact is missing. 

for artifact: 
    com.example:mymodule:war:0.0.1-SNAPSHOT 

from the specified remote repositories: 
    nexus (http://nexusserver.local:8080/nexus/content/groups/public) 



[INFO] ------------------------------------------------------------------------ 
[INFO] For more information, run Maven with the -e switch 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 1 second 
[INFO] Finished at: Thu Jun 09 11:01:24 EDT 2011 
[INFO] Final Memory: 17M/247M 
[INFO] ------------------------------------------------------------------------ 

如果我是運行簡單的「MVN安裝」,罐子是在安裝了「驗證」,並且我可以運行「MVN淨安裝」,在隨後的版本。但是,我們的構建服務器沒有這種靈活性。我已考慮以下內容:

  1. 將階段轉到「預清理」,但假設每個人都始終使用清潔。如果有人只是簡單地運行「mvn install」,這將無濟於事。
  2. 複製執行過程,其中一個在「預清理」期間發生,另一個在「驗證」期間發生。這涵蓋了所有的基礎,但複製的代碼留下了不好的口味。

理想情況下,我想要其他選項。有沒有依賴關係可以運行乾淨?或者運行插件兩次而不必完全複製執行?謝謝!

回答

5

它看起來像你正在使用nexus。將工件部署到聯合回購可能更容易,而不是必須通過此項目來維護工件。

+1

這是一個很好的想法,但我們正處於一個分散的開發團隊的國際公司。在主連線上獲得它是一個漫長的過程。 =( – 2011-06-09 15:58:53

+0

如何使用本地文件庫?您可以將文件打包到您的模塊的peer/child目錄中,然後將該目錄作爲文件:repo添加到您的pom.xml文件中。您可以配置settings.xml以使用你的nexus回購作爲鏡像,但仍然允許本地文件回收 – massfords 2011-06-10 14:10:46

+0

Massfords:更改settings.xml是一個非啓動器,它會影響每個使用該構建的人,我最好是在主連接上獲得工件。我會接受這個答案,因爲即使它不能解決我的特殊情況,它應該適用於大多數人。 – 2011-06-13 19:27:41

0

這是未經測試的,但您是否可以忽略clean插件配置中的錯誤?如:

<plugin> 
    <artifactId>maven-clean-plugin</artifactId> 
    <version>2.4.1</version> 
    <configuration> 
    <failOnError>false</failOnError> 
    </configuration> 
</plugin> 

(這是來自Maven Clean Plugin : Ignoring Clean Errors

+1

不幸的是,不,failOnError不會繞過無法解決依賴關係。 – 2011-06-09 16:01:48

0

下面是一個更可能性。

配置maven跳過清理階段並在初始化期間運行clean。雖然沒有嘗試過。

這個的缺點是maven會一直清理輸出文件夾。

5

我遇到了一個相關的問題,我發現這個問題對谷歌搜索解決方案時,所以在這裏我要指出的:在一個多模塊項目

MVN清潔失敗時,有內缺少依賴同一個項目,如果在清理過程中調用插件。

我們在某些模塊的清理階段調用antrun-plugin,並且因爲所有的依賴需要存在於maven倉庫中,包括其他模塊在同一個反應器中,在某些情況下還沒有還沒建好(比如你剛剛碰到了項目版本,或者你正在開始一個新項目)。

這是一個在http://jira.codehaus.org/browse/MANTRUN-78中報告的maven-antrun錯誤 - 這再次導致maven內核中的錯誤:http://jira.codehaus.org/browse/MNG-3283

我的解決方法是爲開發人員(和詹金斯)提供另一種乾淨的方法(shell/bat腳本,ant腳本或一些git/hg clean操作),並讓他們調用它。

我會爲你的團隊建議一個類似的解決方法(或者只是在你的團隊內部設置一個共享的maven倉庫,如果需要的話可以使用其中一個開發者機器)。