我在我的Web应用程序POM中有以下maven依赖项,而后者又应该引入其他依赖项:
<dependency>
<groupId>com.my.libraries</groupId>
<artifactId>my-libs</artifactId>
<type>pom</type>
<version>1.6-SNAPSHOT</version>
</dependency>
注意我在之前在旧版本中拉出的my-libs
工件有1.5版本。但我后来将版本升级为1.6-SNAPSHOT
。在mathlibrary
释放中没有出现1.5
神器。
我期待一些罐子作为my-libs
神器1.6-SNAPSHOT
的一部分出现在1.5
中不存在 - pOM在下面:
<!-- all the usual POM descriptionsm for my-libs -->
<groupId>com.my.libraries</groupId>
<artifactId>my-libs</artifactId>
<version>1.6-SNAPSHOT</version>
<packaging>pom</packaging>
<!-- continues... all normal stuff, nothing to see here :'/ -->
<dependency>
<groupId>com.my</groupId>
<artifactId>mathlibrary</artifactId>
<version>1.0</version>
</dependency>
<!-- continues -->
如果我为我的项目做mathlibrary
,我预计会拉动mvn package
jar。但当我查看我的webapplication的lib
文件夹时,罐子不在那里。然后我检查了我的.m2
目录内容,似乎只有版本1.5
存在,所以1.6-snapshot没有自动安装。从这里开始,我想如果之前推出了发布版本,它不会拉下一个SNAPSHOT?
在我使用my-libs
手动安装mvn clean install
工件后 - 在我的Web应用程序的下一个版本中,它正确地拉出了罐子。这是否意味着我的package
阶段定义为不自动拉出SNAPSHOT依赖项?或者这是预期的事情(即如果它不是发布版本,我必须手动运行install
阶段)?
使用mvn package
从本地存储库中提取所有SNAPSHOT依赖项(如果工件是远程存储库,还会每24小时从远程存储库更新本地存储库)。
我真的不明白“手动安装的my-libs
”是什么意思,因为没有自动安装工件的方法(除了CI服务器,在checkin上安装/部署)。如果你想使用工件(比如my-libs),你需要构建它并将它放在本地存储库中 - 你可以使用mvn install
来实现。
您的问题的答案取决于您在packaging
中使用的pom.xml
以及哪些插件具有针对packge
阶段定制的执行。处理依赖关系时,Maven通常会解析它们,这意味着相应的jar文件将位于本地存储库中。在你的target
文件夹中获取jar文件(原样或解压缩)是一些插件工作的结果(这样的插件会在prepare-package
或package
阶段(通常)执行一个mojo。所以,请确保使用正确的packaging
(例如war
)或者例如“assembly”插件(可以为你重新打包依赖项)。为了使你的依赖关系可用于解决和进一步使用,你应该将它们deploy
到远程存储库,或者install
它们到本地存储库。
在阅读@JFMeier的答案之后,我做了以下事情:
1)从.m2
目录中删除了所有版本/快照。
2)更改了我的Web应用程序POM以使用1.5
发布my-libs
3)开始构建。
4)一旦构建完成,我确认mylibraries
jar尚未部署在tomcat的WEB-INF \ lib中的最终Web应用程序目录中
5)重复步骤2-4 - 但是将版本改为1.6-SNAPSHOT
为my-libs
。
6)现在我可以看到预期的结果。
当你进行mvn安装时,Maven只进入存储库(全局或本地)。使用Maven Install,Maven会检查项目中是否存在所有POM库,如果缺少某些POM库,则会从存储库下载到项目中。如果您执行Maven包,它只会打包项目中的库。