簡體   English   中英

Maven 3不會從本地存儲庫更新快照依賴項

[英]Maven 3 does not update snapshot dependency from local repository

我正在嘗試在我的maven項目中使用外部庫。 由於我希望項目在任何機器上開箱即用,我不想使用mvn install解決方案。 因此我在我的pom.xml中定義了本地存儲庫:

    <dependency>
        <groupId>com.test</groupId>
        <artifactId>fooLib</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    ....
    <repository>
        <id>in-project</id>
        <snapshots>
            <updatePolicy>always</updatePolicy>
            <enabled>true</enabled>
        </snapshots>
        <name>In Project Repo</name>
        <url>file://${project.basedir}/libRepo</url>
    </repository>

問題是當我更換libRepo的jar(沒有更新版本號,因為它只是另一個快照)沒有使用這個更新的jar(來自.m2目錄的舊版本),即使對於mvn -U clean install如何制作maven更新這個罐子?

編輯 :根據什么是Maven快照,為什么我們需要它? maven應該嘗試找到從不版本的SNAPSHOT依賴,“即使在本地存儲庫中找到了這個庫的版本”。 我的設置有什么問題?

骯臟的解決方案 :基於Maven 2程序集的依賴性答案:在原始解決方案擴展后未包含的范圍“系統”下的jar似乎有效:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <executions>
                <execution>
                    <id>hack-binary</id>
                    <phase>validate</phase>
                    <configuration>
                        <file>${repo.path.to.jar}</file>
                        <repositoryLayout>default</repositoryLayout>
                        <groupId>com.test</groupId>
                        <artifactId>fooLib</artifactId>
                        <version>1.0-SNAPSHOT</version>
                        <packaging>jar</packaging>
                        <generatePom>true</generatePom>
                    </configuration>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

正如對該解決方案的評論中所提到的,它不能單獨工作,因此它與in-project存儲庫(當依賴在本地.m2存儲庫中不可用時工作)一起工作,而第二部分在每次構建期間刷新.m2

然而,我仍然不清楚為什么普通的“SNAPSHOT”機制不起作用(即當前的臟解決方案也可以在沒有SNAPSHOT的情況下工作,因為本地.m2 repo每次都明確更新)。 有沒有更干凈的方式?

解決方案 (基於Aaron的回答和討論):問題是我嘗試使用install-file將文件安裝到libRepo 實際的解決方案是,如果庫更新,請使用

mvn deploy:deploy-file -Dfile=fooLib.jar  -DgroupId=com.test \
    -DartifactId=fooLib -Dversion=1.0-SNAPSHOT -Dpackaging=jar \
    -Durl=file://..\libRepo -DrepositoryId=in-project

將其部署到回購。 正確部署后,maven正確處理SNAPSHOT。

如果你使用存儲庫,那么Maven會將JAR復制到它的本地存儲庫(通常在$HOME/.m2/repository/ )。 除非版本號更改,否則Maven不會認為此文件已更改,也不會復制它。 請注意,版本號是Maven唯一看到的內容; 它不關心校驗和或文件大小或日期。

順便說一下,為此目的在內部為快照分配了一個版本號:這樣Maven就可以在內部注意到快照已經更新。

我建議使用系統依賴 這樣,實際的JAR將被添加到類路徑中(沒有任何復制或東西)。 您也不需要復制此方法的repo結構,它將清楚地傳達您的意圖。

[編輯]我理解Maven以不同的方式處理與范圍system依賴關系。 我不確定這是否有意義(如果它使用依賴編譯,它肯定可以用它來運行?)

在我看來,你有這些選擇:

  1. 使用deploy:deploy-file將依賴項安裝到libRepo而不是自己復制它。 這應該以這樣的方式更新元數據:當您在真實項目上再次運行mvn install時,Maven將再次復制它。

    請注意file:install不起作用。 文件插件用於訪問本地存儲庫,但您需要使用知道如何更新共享/服務器存儲庫的deploy插件。

  2. 將依賴項安裝到本地存儲庫中; 我建議使用一個腳本,你可以包含在你的項目中。 這樣,您可以避免所有問題,並且可以輕松地在新機器上進行設置。

  3. 更改依賴項的版本號,但這很乏味,當依賴項的實際版本號發生更改時,您可能會遇到麻煩。

  4. 為您的公司設置本地repo服務器並將依賴關系部署到它。 這將需要幾個小時,但a)您將獲得所有依賴項的本地緩存,使您的初始構建更快,b)它將更快地為其他開發人員設置。

Maven永遠不會讀取任何庫文件夾中的jar。 你必須首先了解maven是如何工作的。 maven查找jar的唯一地方是localRepository (.m2) ,如果沒有,它會搜索POM.xml提到的其他存儲庫

前面的回答者(和一個評論者)指出,maven只在本地項目存儲庫中查找一次,在后續構建中,它從.m2-repository獲取緩存的jar。

我剛剛找到了一個解決方法,需要增加版本號(例如,對dev庫的小改動):

首先將jar重新安裝到本地項目庫中:

mvn install:install-file -DlocalRepositoryPath=repo -DcreateChecksum=true -Dpackaging=jar -DgroupId=com.johndoe.dev -DartifactId=Helpers -Dversion=0.1 -Dfile=C:/path/to/helpers.jar

(其中-Dfile可以指向生成helpers.jar的外部項目)

然后清除.m2-repository中的這個特定工件:

mvn dependency:purge-local-repository -DmanualInclude=com.johndoe.dev:Helpers:0.1

(使用com.johndoe.dev作為GroupId,將Helpers作為ArtifactId,並在上一步中安裝相同的版本)

執行后一步,maven使用您的本地project-repository jar文件重建.m2中的工件。

替代方案,也許是臟的變體:只需將helpers.jar復制到C:\\ Users \\ johndoe \\ .m2 \\ repository \\ com \\ johndoe \\ dev \\ Helpers \\ 0.1 \\ Helpers-0.1.jar(不知道linux,因為我沒有'在那里使用mave)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM