2013-12-13 140 views
4

我已經使用maven一段時間以常用的方式進行了開箱即用設置,所以我明白它是什麼,但我是maven設置中的新手。下載maven項目依賴關係以後離線構建

我需要舉辦這樣的工作流程:

  1. 開發者編寫Java代碼,使用一些依賴從互聯網上。
  2. 開發人員提交他的工作。
  3. TeamCity可以自動構建他的工作。沒有任何手動工作,沒有互聯網。

我知道如何做到這一點:

  1. Developer使用Maven的。 「common」目錄充當某些java項目的存儲庫。
  2. 工作完成後,開發人員將他的項目和公共目錄提交到svn。
  3. TeamCity從svn更新項目和公共目錄並運行「mvn package」。任何需要從公共目錄中獲取。不用擔心互聯網連接和啓動鏈接,或其他回購服務。

我的問題是: 如何使用文件系統上的簡單目錄作爲某些項目的代理存儲庫? 請告訴我如何實現這個想法或給我另一個想法來實現這樣的工作流程。

我可以只提交本地資源庫,但也有一定的侷限性:

  1. 本地回購拉鍊文物。如果我對它進行了很小的更改 - 整個緩存文件都必須上傳並從svn下載。這需要很長時間。
  2. 所有項目的本地回購商店工件。我只想要某些項目使用此回購,因爲開發人員不想檢查更改並過濾未使用的依賴關係。

我測試本地目錄寫入部署項目,簡單:在回購網址「文件// testRespoDir」,但我不明白如何讓這個目錄代理所有遠程文物項目(項目不得使用你要做的是創建那麼本地回購,只使用公共目錄。

+0

那麼如何使用文件系統上的簡單目錄作爲某些項目的代理存儲庫? – cynepnaxa

+0

這聽起來像你會更喜歡像Git或Mercurial DVCS。 –

+0

Afaik DVCS不能幫助項目管理 - 它只是存儲它。我們在我們的團隊中使用SVN。我使用Git一段時間。這很舒服,但無法完成這項任務。 – cynepnaxa

回答

3

我找到簡單而完美的解決方案: POM包括2個倉庫:

<repositories> 
    <repository> 
     <id>commonDep</id> 
     <name>common dependency</name> 
     <url>file://../common/repository</url> 
    </repository> 
    <!-- it used when collect dependencies before commit. If developer already download dependency, get it from local repo, save traffik and time --> 
    <repository> 
     <id>localPlugins</id> 
     <name>local plugins</name> 
     <url>file://${user.home}/.m2/repository</url> 
    </repository> 
</repositories> 
<pluginRepositories> 
    <pluginRepository> 
     <id>commonDep</id> 
     <name>common dependency</name> 
     <url>file://../common/repository</url> 
    </pluginRepository> 
    <!-- it used when collect dependencies before commit. If developer already download dependency, get it from local repo, save traffik and time -->  
    <pluginRepository> 
     <id>localPlugins</id> 
     <name>local plugins</name> 
     <url>file://${user.home}/.m2/repository</url> 
    </pluginRepository> 
</pluginRepositories> 

當開發人員打開項目中,他使用的地方,共同和中央存儲庫中的命令。它節省了他的流量。當他完成了工作,他稱之爲腳本:從他的默認本地存儲庫,以公共資源庫拷入項目

mvn dependency:go-offline -Dmaven.repo.local=../common/repository 

目前所有的依賴關係。然後開發人員提交共同

當我們在teamcity上運行構建時,我們會簽出項目和常用項並運行它。沒有互聯網連接,但所有的依賴關係都存在於公共存儲庫中。

+0

'mvn dependency:go-offline -Dmaven.repo.local = ../common/repository'將導致maven從中央下載,而不是從本地下載。 – Amos

1

是的,你可以做到這一點我個人不是特別建議,如果你使用快照的,但是你應該可以。

一個網絡驅動器(我不知道你是否在Windows或Linux,但它不重要)。

然後在需要它的所有系統上安裝該網絡驅動器。

然後在Maven的配置文件指定本地Maven回購的位置:

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 
         http://maven.apache.org/xsd/settings-1.0.0.xsd" > 

     <localRepository>c:/mvn-repo/</localRepository> 
     ... 
    </settings> 

更換C:/ MVN回購/與路徑您希望使用的網絡驅動器上的目錄。

你可以將這個配置放置在不同的地方,但我建議將它放置在@ $ {MAVEN_HOME} /conf/settings.xml的根配置文件中。

您需要在每臺使用maven的計算機上指定此項。

然後,應該這樣做,所有你的maven運行時間將共享相同的本地回購。

那麼如何找到使用不同目錄的不同項目呢?這是一個棘手的問題,您可以在網絡驅動器上使用不同的目錄,並通過將localRepository變量指定爲運行時屬性來更改@運行時。

mvn -Dmaven.repo.local=$HOME/.my/other/repository clean install 

這樣,你會擁有這一切瓜分了每個項目的目錄很好的一個網絡驅動器,然後簡單地指定變量@運行時間設定要使用的本地回購。

+0

我們使用可靠的destribution機制-svn,最好不要使用額外的一個:) – cynepnaxa

+0

你知道嗎,我怎樣才能複製項目的所有依賴關係與類庫的結構的目錄?使用哪個插件? – cynepnaxa

1

您建議的流程不會擴展。我寧願建立一箇中央存儲庫的本地企業鏡像,讓開發人員和自動化服務器(teamcity等)都使用它。設置簡單,易於維護,易於跟蹤第三方軟件的依賴性並實施限制。

+0

是的,我知道這很容易,我已經在我的本地機器上安裝了nexus。但它不可靠。例如,如果您需要構建一些舊版本的項目並使用快照版本的依賴關係,那該怎麼辦。我們來限制「不要使用快照依賴」。而且維護企業聯繫是另一個步驟。從svn更新回購沒有問題,因爲任何方式我必須簽出項目 - 一個或多或少沒有區別。 – cynepnaxa

+0

好吧,如果你對可用性有偏見,請使用maven倉庫坐在src dir旁邊並將它提交給svn :) – bobah

+0

是的,我想這樣做,但不知道該怎麼做:)。開發人員從中央下載依賴關係,它存儲在repo目錄中。所以在pom中一定是這樣的指導。也許在pom中重寫localrepo到相對路徑?無法弄清楚如何...然後提交回購和項目,在另一臺機器上籤出,運行mvn。這裏簡單的存儲庫元素必須幫助。但是在我目前的repo中有一個很大的緩存文件,即使變化很小,也需要很長時間來提交和檢出。 – cynepnaxa

0

我想嘗試這樣的解決方案:

  1. 添加存儲庫文件:// testRespoDir到POM。
  2. 在pom中,init中有一個插件,它將項目依賴關係複製到此回購庫,如果這些依賴項不存在那裏。
  3. 在teamcity服務器上禁用Central。

只有一個問題 - 哪個插件可以以這種方式複製依賴關係?

+0

對我來說,工作是指定一個**本地存儲庫位置**,或者在具有 ...的'settings.xml'文件中或通過'-Dmaven運行'mvn'。 local.repo = ...'參數。 然後,在最初的項目構建之後,所有必需的構件都應該被緩存,並且可以以相同的方式引用這個存儲庫位置,同時以離線模式運行其他Maven構建('mvn -o ...')。 – luka5z