问题
- 团队其他成员(例如:小明)维护了一个公用的 jar ,例如:com.jar ,在他的 pom 中 com 的 version 带有 SNAPSHOT,例如:
<version>0.0.1-SNAPSHOT</version>
; - 然后当别人使用小明维护的 com.jar 时,dependency 的version 和小明写的一样
<version>0.0.1-SNAPSHOT</version>
,完整 dependency为 :<dependency> <groupId>com.A</groupId> <artifactId>com</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
,但是发现无论如何都无法引入,甚至如果<groupId>com.A</groupId>
中的 A 是一个新的路径时,在使用者本地仓库中都无法创建;
原因
- 小明在自己的开发环境执行
mvn deploy
命令,将 com 公用jar 发布到私服,maven 会自动替换 SNAPSHOT 为 deploy 命令执行时的时间戳; - 其他人引用时 需要一个
com-0.0.1-SNAPSHOT.jar
的包,实际上 在私服 /0.0.1-SNAPSHOT 目录下是没有的,会报错; - 根本原因是:snapshots 下 updatePolicy 默认为 daily,这也就是有人神奇的发现第二天会下载下来的原因。包括 meta 每天第一次执行下载 也是这个配置导致的。
解决
手动下载,手动安装
- 1、手动下载私服 /0.0.1-SNAPSHOT 目录下最新版的 jar;
- 2、执行命令:
mvn install:install-file -DgroupId=com.A-DartifactId=com -Dversion=0.0.1-SNAPSHOT -Dpackaging=jar -Dfile=/path/com-xxxx.jar
; - 优点:快速修复,过程可控
- 缺点:小明再次更新 com 公用jar 时,需要再次执行以上两步,否则无法使用最新的jar;
setting.xml
- 修改 setting.xml 文件的
<profiles>
和<activeProfiles>
节点:如下,注意 profile id 的对应关系
...
<profiles>
...
<profile>
<id>dev</id>
<repositories>
<repository>
<id>nexus</id>
<url>http://ip:port/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<url>http://ip:port/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
...
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
...
- 其中:updatePolicy 为更新snapshot包的频率,属性有四个值always(实时更新) ;daily(每天更新); interval:xxx(隔xxx分钟更新一次) ; never(从不更新) 默认为daily;具体可参加官网
- 这个配置会自动下载私服中最新的那一版jar,以后也会自己更新;
- 优点:自动更新;
- 缺点:我不知道,我猜测,可能 对profile有什么影响,后续发现我会补上。。。
让小明调整一下
- 其实问题本就出在小明那边,他进行了一种非推荐或者叫非正规操作;给别人用就应该是 release 版本;
以下方式确实没用:虽然单从名字看上去是十分的像那么回事,单确实没用。还有另外一个 deploy 插件的参数
uniqueVersion
确实是解决 snapshot 的问题的,但在 maven-3 版本 这个参数也是无效的,被忽略了。
- 那方法就很多了,例如执行 deploy 时加上 DuseUniqueVersions=false ,这样
mvn deploy -DuseUniqueVersions=false
;或者在pom中配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.xxxx.Application</mainClass>
<classpathPrefix>dependency/</classpathPrefix>
<useUniqueVersions>false</useUniqueVersions>
</manifest>
</archive>
</configuration>
</plugin>
以上配置参考:https://blog.csdn.net/quliuwuyiz/article/details/79363826,并未验证(2024-11-24: 经 验证以上方式无用)
- 但是有时候并不是每个人都特别好沟通;或者由于某些原因,确实无法调整;