2011-10-21 56 views
6

當我正在開發時,我經常需要更改依賴項,但我還沒準備好部署我的更改。例如,我正在研究項目Foo,並且我意識到我需要爲公共庫添加一個方法。在將此更改部署到我們的內部存儲庫之前,我想將更改安裝到公共庫(mvn install)並重新編譯Foo以使用本地存儲庫中的通用庫(請注意,我正在使用所有SNAPSHOT版本)。爲什麼maven在我的本地存儲庫之前使用我的內部存儲庫?

但是,在我使用我的通用庫之後,當我重新編譯Foo時,它不使用新的通用庫 - 它在內部存儲庫中始終使用最新的SNAPSHOT通用庫。如果我部署已更改的通用庫,Foo會立即採用它。

如何讓maven先查看本地存儲庫?

更新:當文件安裝到本地存儲庫時,它會得到一個名稱,如foo-1.0.0-SNAPSHOT.jar,但是當我部署它時,它會得到一個時間戳foo-1.0.0-20111104.191316-23.jar。我認爲這就是爲什麼遠程神器每次都被拉動的原因。任何想法爲什麼mvn install不像mvn deploy那樣工作?這是否與我爲快速部署設置了快照庫有關?

+0

你的[settings.xml](http://maven.apache.org/settings.html)中是否有一個localRepository指向一個不存在的位置? – millhouse

+0

將您的系統日期與您的內部回購(例如Nexus)系統的日期進行比較。如果還有很長的路要走,它的時間戳將會「贏」 – millhouse

回答

3

默認情況下,Maven每天檢查一次新版本的SNAPSHOT工件。當它執行此檢查時,它將從遠程回購下載SNAPSHOTS,這些數據比本地更新。您的工件時間戳不同步,並且您正在執行某些操作來覆蓋Maven的更新策略(如calling it with -Usetting the udpatePolicy爲「always」),否則您正在安裝工件的本地存儲庫與您的「隨後運行Maven反對。你所描述的不是典型的Maven行爲。爲了得到更好的答案,請在你的問題中提供更多細節。

你可以尋找的一個指標:安裝普通工件後,當你下一次編譯Foo時,Maven會再次下載普通工件嗎?如果是這樣,那麼它確實是從遠程獲取它,你需要檢查你的更新設置。如果沒有,那麼你在本地出現了一些奇怪的事情。

+0

謝謝瑞恩,顯然沒有人會更詳細地告訴我發生了什麼。知道這首先不是標準行爲是有幫助的,所以我可以進一步調查! – schmmd

+0

我添加了一些更多細節 - 請參閱我的問題最後的更新。 – schmmd

+0

現在,Maven已經使用時間戳來唯一標識部署到遠程倉庫的快照版本,而「SNAPSHOT」僅僅是這些時間戳項目中最新的一個別名。我認爲這開始在2.1.0左右。它不會改變你的問題。 –

0

你可以試試這個選項。這對我有效。

在您的項目的主pom.xml中將'snapshots'啓用設置爲'false'。

<repository> 
    <id>yourRepo</id> 
    <name>Repository</name> 
    <url>http://your.repo.com/repo</url> 
    <snapshots> 
     <enabled>false</enabled> 
    </snapshots> 
</repository>