当前位置: 首页 > 知识库问答 >
问题:

Maven 3 不更新本地存储库中的快照依赖项

石正奇
2023-03-14

我试图在maven项目中使用外部库。由于我希望在任何机器上构建项目,所以我不希望使用mvn安装解决方案。因此,我在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清洁安装如何让maven更新这个jar?

编辑:根据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>

正如在对该解决方案的评论中所提到的,它不单独工作,因此它与< code >项目内存储库(当依赖项在本地< code>.m2存储库中不可用时工作)结合工作,并且第二部分在每次构建期间刷新< code>.m2。

但是,我仍然不清楚为什么普通的“快照”机制不起作用(即,当前的脏解决方案在没有快照的情况下也能工作,因为本地< code>.m2 repo每次都显式更新)。有没有更干净的方法?

解决方案(基于Aaron的回答

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 会正确处理快照。

共有3个答案

程钧
2023-03-14

前面的回答者(和一个评论者)指出,maven只在本地项目存储库中查看一次,在后续的构建中,它从. m2存储库中获取缓存的jar。

我刚刚找到了一个解决方法,以解决需要增加版本号的问题(例如,在开发库的微小更改上):

首先将 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 可以指向生成帮助程序的外部项目.jar)

然后仅清除 .m2 存储库中的此特定工件:

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

(将com.johndoe.dev作为组ID,将Helpers作为工件ID,并在上一步中安装相同的版本)

执行后一步,maven使用本地项目存储库jar文件重新构建.m2中的工件。

替代的,也许肮脏的变体:只是复制helpers.jar到C:\用户\johndoe\. m2\repository\com\johndoe\dev\Helpers\0.1\Helpers-0.1.jar(不知道linux,因为我没有使用mave那里)。

琴献
2023-03-14

Maven永远不会读取任何库文件夹中的jar。您必须首先了解maven的工作原理。maven查找jar的唯一地方是localRepository(.m2),如果没有,它会搜索另一个存储库,如您的POM.xml中所述

李胤
2023-03-14

如果您使用了一个存储库,那么Maven将把JAR复制到它的本地存储库中(通常是$HOME/.m2/repository/)。除非版本号更改,否则Maven不会认为该文件已更改,也不会复制它。注意,版本号是Maven唯一关注的东西;它不关心校验和、文件大小或日期。

顺便说一下,快照在内部被分配了一个版本号就是为了这个目的:这样Maven就可以在内部注意到快照已经被更新了。

我建议改用系统依赖关系。这样,实际的 JAR 将被添加到类路径中(没有任何复制或内容)。您也不需要为此方法复制存储库结构,它将清楚地传达您的意图。

[编辑]我知道Maven以不同的方式处理范围system的依赖关系。我不确定这是否有意义(如果它使用依赖项来编译,它肯定可以使用它来运行?)

在我看来,您有以下选择:

>

  • 使用部署:部署文件而不是自己复制它,将依赖项安装到您的libRepo中。这应该会更新元数据,以便Maven在您再次运行mvn install时再次复制它在真实项目上。

    注意< code>file:install不起作用。file插件用于访问本地存储库,但是您需要使用deploy插件,它知道如何更新共享/服务器存储库。

    将依赖项安装到本地存储库中;我建议为此使用一个脚本,您可以将其包含在项目中。这样,您就可以避免所有问题,并且很容易在新计算机上进行设置。

    更改依赖项的版本号,但这很繁琐,当依赖项的实际版本号更改时,您可能会遇到麻烦。

    为公司设置本地存储库服务器,并将依赖项部署到其中。这将需要几个小时,但a)您将获得所有依赖项的本地缓存,使您的初始构建更快,b)这将使其他开发人员的设置速度更快。

  •  类似资料:
    • 我一直在设置一个Apache Archiva实例,作为Maven Central的代理和捕获我们的开发快照。我已经设法设置了代理,我可以将工件部署到Archiva快照存储库,但是我不能从快照存储库中提取工件以用于其他项目。 pom.xml相关部分(附属项目) 我的~/。m2/设置。xml 当我构建依赖项目时,我不能引用类(公共访问)。 只是要注意,我可以浏览快照存储库,我知道war文件在那里。 有

    • 我对maven是新手,在将pom.xml中定义的依赖项下载到本地存储库时遇到了问题。正确下载pom.xml中定义的所有其他依赖项。此外,跨多个项目的其他依赖关系也运行良好。我使用的是maven 3.5.2和aws sdk 1.11.86 导致问题的依赖项是定义为的aws红移驱动程序- Maven存储库- 我的本地回购协议有以下内容- 我已经删除了本地文件。上次更新的文件,但无法解决此问题<有什么想

    • 我在本地发布了一个依赖项。依赖项位于路径上 我认为这是Windows上的默认路径。 现在,在另一个项目中,我尝试使用这个库。我的<code>构建。gradle如下所示(以及其他依赖项) 我收到构建错误,某些类不存在等... 这不足以从本地存储库中识别依赖项吗? 我也为其他依赖项使用远程存储库,但工件名称版本是唯一的(com.mycompany:mylibrary:1.0)。我希望从本地存储库中找到

    • 我所处的环境是,可以将同名jar文件的多个版本发布到本地Nexus安装。这些jar文件始终命名为XYZ-SNAPSHOT。罐子我们的持续集成系统需要始终获取最新版本,因此我们的自动构建当前包含以下内容,以消除持续集成机器上的完整本地回购: mvn依赖项:清除本地存储库 这将强制在每个构建上下载所有依赖项,这将花费很长时间。是否有某种方法可以将“includes”标志与通配符一起使用。我可以这样假设

    • 我已通过mvn install: install-file将jar文件添加到我的本地maven存储库中,该文件在我的本地机器上运行良好。这是我的pom中的依赖项: 在我的机器上运行mvn清洁安装时,一切正常。现在我有一个本地jenkins实例正在运行(在Windows机器上),它应该构建我的项目。构建遇到错误,jenkins说:

    • 更新:简化我的问题-我有一个模块mod1,它被用作模块MOD2中的依赖项。我希望确保mod2始终使用mod1的最新版本快照。如何在Maven中实现这一点? 但是,这总是解析到发布版本1.0,而从不解析到1.1-快照,它在本地回购中。如何确保使用最新的快照?如果有任何建议,我将不胜感激。