我正在尝试在我的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>
Run Code Online (Sandbox Code Playgroud)
问题是当我更换jar libRepo(没有更新版本号,因为它只是另一个快照)没有使用这个更新的jar(来自.m2目录的旧版本),甚至对于mvn -U clean install
如何让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>
Run Code Online (Sandbox Code Playgroud)
正如对该解决方案的评论中所提到的,它不能单独工作,因此它与in-project存储库(当依赖在本地.m2存储库中不可用时工作)一起工作,并且第二部分.m2在每次构建期间刷新.
然而,我仍然不清楚为什么普通的"SNAPSHOT"机制不起作用(即当前的脏解决方案也可以在没有SNAPSHOT的情况下工作,因为.m2每次都会明确更新本地存储库).有没有更干净的方式?
解决方案(基于Aaron的回答和讨论):问题在于我尝试将文件安装到libRepo使用中install-file.实际的解决方案是,如果库更新,请使用
mvn deploy:deploy-file -Dfile=fooLib.jar -DgroupId=com.test \
-DartifactId=fooLib -Dversion=1.0-SNAPSHOT -Dpackaging=jar \
-Durl=file://..\libRepo -DrepositoryId=in-project
Run Code Online (Sandbox Code Playgroud)
将其部署到回购.正确部署后,maven正确处理SNAPSHOT.
如果您使用存储库,那么Maven会将JAR复制到其本地存储库(通常在$HOME/.m2/repository/)中.除非版本号更改,否则Maven不会认为此文件已更改,也不会复制它.请注意,版本号是Maven唯一关注的内容; 它不关心校验和或文件大小或日期.
顺便说一下,为此目的在内部为快照分配了一个版本号:这样Maven就可以在内部注意到快照已经更新.
我建议使用系统依赖.这样,实际的JAR将被添加到类路径中(没有任何复制或东西).您也不需要复制此方法的repo结构,它将清楚地传达您的意图.
[编辑]我理解Maven以system不同的方式处理依赖关系.我不确定这是否有意义(如果它使用依赖编译,它肯定可以用它来运行?)
在我看来,你有这些选择:
将依赖项安装到libRepo使用的deploy:deploy-file中,而不是自己复制它.这应该以这样的方式更新元数据:当您mvn install再次在真实项目上运行时,Maven将再次复制它.
请注意,file:install这不起作用.文件插件用于访问本地存储库,但您需要使用知道如何更新共享/服务器存储库的deploy插件.
将依赖项安装到本地存储库中; 我建议您使用一个脚本,以便将其包含在项目中.这样,您可以避免所有问题,并且可以轻松地在新机器上进行设置.
更改依赖项的版本号,但这很乏味,当依赖项的实际版本号发生更改时,您可能会遇到麻烦.
为您的公司设置本地repo服务器并将依赖关系部署到它.这将需要几个小时,但a)您将获得所有依赖项的本地缓存,使您的初始构建更快,b)它将更快地为其他开发人员设置.
| 归档时间: |
|
| 查看次数: |
25580 次 |
| 最近记录: |