【发布时间】:2014-03-27 18:20:01
【问题描述】:
我正在尝试在我的 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 时(不更新版本号,因为它只是另一个快照),即使是 @987654327,也没有使用这个更新的 jar(使用来自 .m2 目录的旧版本) @
如何让maven更新这个jar?
编辑: 根据What exactly is a Maven Snapshot and why do we need it? maven 应尝试查找从不版本的 SNAPSHOT 依赖项,“即使在本地存储库中找到此库的版本”。我的设置有什么问题?
肮脏的解决方案: 根据Maven 2 assembly with dependencies: jar under scope "system" not included 的回答,我的原始解决方案的以下扩展似乎有效:
<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 存储库中的依赖项不可用时有效)并且第二部分刷新@987654331 @ 在每次构建期间。
但是我仍然不清楚为什么普通的“SNAPSHOT”机制不起作用(即当前的脏解决方案在没有 SNAPSHOT 的情况下也可以工作,因为本地 .m2 回购每次都会显式更新)。有没有更干净的方法?
解决方案(基于 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
将其部署到 repo。正确部署后,maven 可以正确处理 SNAPSHOT。
【问题讨论】:
-
您是在构建依赖项还是在构建主项目时使用
mvn -U clean install? -
我仅将 maven 用于“主”项目。
fooLib不是 maven 项目,是独立构建的。我只想在我的 Maven(“主”)项目中使用 fooLib 的更新快照。 -
所以你必须手动安装
fooLib,因为它永远不会在你的.m2文件夹中更新,除非它的版本发生变化。