我的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。但当我查看我的web应用程序的lib
文件夹时,jar就不存在了。然后我检查了我的.m2
目录内容,似乎只有版本1.5
,因此没有自动安装1.6快照。从这里开始,我想如果之前推出的是发布版本,它不会拉下一个SNAPSHOT吗?
使用my-libs
手动安装mvn clean install
工件后 - 在我的Web应用程序的下一个版本中,它正确地拉出了jar。这是否意味着我的package
阶段定义为不自动拉出SNAPSHOT依赖项?或者这是预期的事情(即如果它不是发布版本,我必须手动运行install
阶段)?
答案 0 :(得分:1)
使用mvn package
从本地存储库中提取所有SNAPSHOT依赖项(如果工件是远程存储库,还会每24小时从远程存储库更新本地存储库)。
我真的不明白“手动安装my-libs
”是什么意思,因为没有自动安装工件的方法(CI服务器除外,在checkin上安装/部署) 。如果要使用工件(如my-libs),则需要构建它并将其放在本地存储库中 - 然后使用mvn install
执行此操作。
答案 1 :(得分:0)
您的问题的答案取决于您packaging
中使用的pom.xml
以及哪些插件针对packge
阶段执行了哪些插件。处理依赖关系时,Maven通常会解析它们,这意味着相应的jar文件将位于本地存储库中。
在你的target
文件夹中获取jar文件(原样或解压缩)是一些插件工作的结果(这样的插件会在prepare-package
或package
阶段(通常)执行一个mojo。所以,请确保使用正确的packaging
(例如war
)或例如“assembly”插件(可以为您重新打包依赖项)。
要使您的依赖项文件可用于解决和进一步使用,您应该deploy
将它们发送到远程存储库,或者install
它们到本地存储库。
答案 2 :(得分:0)
在阅读@JFMeier的答案之后,我做了以下事情:
1)从我的.m2
目录中删除了所有版本/快照。
2)将我的网络应用POM更改为使用1.5
my-libs
版本
3)开始构建。
4)一旦构建完成,我确认在tomcat的WEB-INF \ lib中我的最终Web应用程序目录中没有部署mylibraries
jar
5)重复步骤2-4 - 但是将1.6-SNAPSHOT
的版本更改为my-libs
。
6)现在我可以看到预期的结果。
答案 3 :(得分:-2)
当您进行mvn安装时,Maven只会进入存储库(全局或本地)。使用Maven Install,Maven会检查项目中是否存在所有POM库,如果缺少某些POM库,则会从存储库下载到项目中。如果您执行Maven包,它只会打包项目中的库。