Maven - 处理快照依赖项

时间:2017-12-21 18:53:06

标签: java maven

我的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-SNAPSHOTmathlibrary版本中没有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阶段)?

4 个答案:

答案 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-packagepackage阶段(通常)执行一个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包,它只会打包项目中的库。