maven SNAPSHOT jar 包 带时间戳,引用问题


问题

  • 团队其他成员(例如:小明)维护了一个公用的 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: 经 验证以上方式无用)

  • 但是有时候并不是每个人都特别好沟通;或者由于某些原因,确实无法调整;
### 如何配置 Maven 快照版本时间戳 Maven 的 `settings.xml` 文件可以用来控制快照版本的更新频率。通过设置 `<snapshots>` 元素下的 `<updatePolicy>` 属性,能够定义何检查远程仓库中的新快照版本。 #### 设置快照更新策略 在 `${user.home}/.m2/settings.xml` 或者项目级别的 `pom.xml` 中,可以通过如下方式来配置: ```xml <repositories> <repository> <id>example-repo</id> <url>http://repo.example.com/maven2</url> <releases> <!-- 对于发布版,默认总是不检查 --> <enabled>true</enabled> <checksumPolicy>warn</checksumPolicy> <updatePolicy>never</updatePolicy> </releases> <snapshots> <!-- 对于快照版,这里指定了每小检查一次 --> <enabled>true</enabled> <checksumPolicy>warn</checksumPolicy> <updatePolicy>hourly</updatePolicy> </snapshots> </repository> </repositories> ``` 上述配置中,对于快照版本设置了 `hourly` 更新策略,意味着每隔一小会尝试拉取最新的快照版本[^1]。 #### 时间戳机制的工作原理 当启用快照支持并部署了一个新的构建,该构建会被赋予一个基于当前日期和间的时间戳名称。例如,假设有一个名为 `my-app-1.0-SNAPSHOT.jar` 的工件,在每次成功构建后实际存储的名字可能是类似于 `my-app-1.0-20230918.174512-1.jar` 这样的形式。这种命名约定允许区分不同间点上的同一快照版本的不同实例[^2]。 #### 自定义时间戳格式 默认情况下,Maven 使用 ISO 8601 标准格式化时间戳。然而,也可以自定义此行为,但这通常涉及到修改服务器端配置而非客户端侧的 `settings.xml` 文件。大多数候,默认的行为已经足够满足需求。 #### 控制台命令指定 settings.xml 为了确保这些配置生效,可以在执行 Maven 命令显式地指向所需的 `settings.xml` 文件路径: ```bash mvn clean install --settings /path/to/your/custom-settings.xml ``` 这使得能够在不同的环境中灵活应用各种设定而无需更改全局配置文件。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值