比较两个jar包的版本号
一、背景
我们经常会遇到比较两个jar包的版本号,这里贴下相关实现。
请尊重作者劳动成果,转载请标明原文链接:https://www.cnblogs.com/waterystone/p/11385472.html
二、方案
2.1 引用maven-artifact
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-artifact</artifactId>
<version>3.6.0</version>
</dependency>
import org.apache.maven.artifact.versioning.DefaultArtifactVersion; public void compareTo() {
DefaultArtifactVersion version1 = new DefaultArtifactVersion("1.1.14");
DefaultArtifactVersion version2 = new DefaultArtifactVersion("1.2.7");
int res = version1.compareTo(version2);
logger.info("res={}", res);
}
2.2 自己实现
源码参考:https://github.com/waterystone/adu-test/blob/master/src/main/java/com/adu/utils/VersionUtil.java
package com.adu.utils; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.util.regex.Matcher;
import java.util.regex.Pattern; /**
* jar包中版本相关的工具。
* @author adu
* @date 2019-08-20 17:27
*/
public class VersionUtil {
private static final Logger logger = LoggerFactory.getLogger(VersionUtil.class); /**
* @param jarName1 要求jar名称必须是*-x.y.z(.|-)*的形式,x、y、z代表任意数字,且可以有多个。如abc-1.jar、abc-1.2.jar、abc-1.2.3.jar、abc-1.2.3.4.jar、abc-1.2.3-jre.jar.
* @param jarName2 要求jar名称必须是*-x.y.z(.|-)*的形式,x、y、z代表任意数字,且可以有多个。如abc-1.jar、abc-1.2.jar、abc-1.2.3.jar、abc-1.2.3.4.jar、abc-1.2.3-jre.jar.
* @return 0:相等;1:大于;-1:小于。
*/
public static int compareVersion(String jarName1, String jarName2) {
int res = 0;
String version1 = extractVersion(jarName1);
String version2 = extractVersion(jarName2); String[] levels1 = version1.split("\\.");
String[] levels2 = version2.split("\\."); int length = Math.max(levels1.length, levels2.length);
for (int i = 0; i < length; i++) {
Integer v1 = i < levels1.length ? Integer.parseInt(levels1[i]) : 0;
Integer v2 = i < levels2.length ? Integer.parseInt(levels2[i]) : 0;
int compare = v1.compareTo(v2);
if (compare != 0) {
res = compare;
break;
}
} logger.debug("op=end_compareVersion,jarName1={},jarName2={},version1={},version2={},res={}", jarName1, jarName2, version1, version2, res);
return 0;
} //要求jar名称必须是*-x.y.z(.|-)*的形式,x、y、z代表任意数字,且可以有多个。如abc-1.jar、abc-1.2.jar、abc-1.2.3.jar、abc-1.2.3.4.jar、abc-1.2.3-jre.jar.
private static final String VERSION_REGEX = "-((\\d+.)+\\d)(\\.|-)";
private static Pattern VERSION_PATTERN = Pattern.compile(VERSION_REGEX); /**
* 抽取出jar包名称中的version
*
* @param jarName 要求jar名称必须是*-x.y.z(.|-)*的形式,x、y、z代表任意数字,且可以有多个。如abc-1.jar、abc-1.2.jar、abc-1.2.3.jar、abc-1.2.3.4.jar、abc-1.2.3-jre.jar.
* @return
*/
public static String extractVersion(String jarName) {
Matcher matcher = VERSION_PATTERN.matcher(jarName);
if (matcher.find()) {
return matcher.group(1);
} logger.error("[ERROR_extractVersion_illegal_param]fullJarName={}", jarName);
throw new IllegalArgumentException(String.format("非法参数[%s],无法提取版本,请检查!", jarName));
}
}
比较两个jar包的版本号的更多相关文章
- 如何对比两个Jar包
如果对比两个jar包呢?jar 都是class 文件,我对比jar,就是想知道,它增加了删除了哪些方法.增加了哪些类,删除了哪些类. 有很多方法,你可以,反编译,然后通过beyongCompair 去 ...
- maven 问题解决 tools以及jconsole两个jar包 无效
在SVN上下载项目,结果完成后出现两个jar包不存在的情况 如下图: 然后,第一步就是去查看POM.xml文件是否配置了这两个文件,结果并没有,于是就更加奇怪了 所以怀疑是不是其他maven下载的ja ...
- @ResponseBody 返回json字符串的核心类是org.springframework.http.converter.json.MappingJacksonHttpMessageConverter,它使用了Jackson 这个开源的第三方类库。主要是以下两个jar包:jackson-core-asl-1.6.4.jar;jackson-mapper-asl-1.6.4.jar
@ResponseBody 返回json字符串的核心类是org.springframework.http.converter.json.MappingJacksonHttpMessageConvert ...
- SpringMVC中ModelAndView的两个jar包引起的思考servlet和portlet
在使用ModelAndView时,需要去导包,但是有两个包. 检查前台form表单提交的也正确,后台这也没有问题. 后来发现竟然时导包导错误了. 到此,如果是因为到错包问题,应该就解决了. 但是,深入 ...
- android 合并两个jar包
你所要导出的类里边用到了别的jar包.比如说你写的类连接了数据库,用到数据库驱动包oracl.jar(也就是你导入到Myeclipse或eclipse的jdbc包).. .在dos环境下,进入到D盘的 ...
- 如何查看jar包的版本号?
jar包根目录里的META-INF目录下的MANIFEST.MF文件里一般有会记录版本信息,可以到这个文件里查看 打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录,这个 ...
- 如何查看jar包的版本号?(转)
转自 : http://www.cnblogs.com/wych/p/4072913.html jar包根目录里的META-INF目录下的MANIFEST.MF文件里一般有会记录版本信息,可以到这个文 ...
- net.sf.json与fastjson两种jar包的使用
首先说清楚:这两种方式是进行json解析的两种不同的方式而已,哪一种都可以. 一.引入net.sf.json包 首先用net.sf.json包,当然你要导入很多包来支持commons-beanutil ...
- sqoop2 缺少 jackson-core-asl-1.8.8.jar 和 jackson-mapper-asl-1.8.8.jar 这两个jar包
[root@spark2 client]# cat /var/log/sqoop2/localhost.2017-12-22.log 十二月 22, 2017 10:29:17 上午 org.apac ...
随机推荐
- Vue.js安装及环境搭建
Vue.js环境搭建-Windows版 步骤一:安装node.js 在搭建vue的开发环境之前,需要先下载node.js,vue的运行是要依赖于node的npm的管理工具来实现,node可以在官网或者 ...
- centos 8 重启网络 systemctl restart network 失效的解决办法
参考: https://www.tecmint.com/set-static-ip-address-in-rhel-8/ https://www.tecmint.com/configure-netwo ...
- kali渗透综合靶机(五)--zico2靶机
kali渗透综合靶机(五)--zico2靶机 靶机地址:https://www.vulnhub.com/series/zico2,137/#modal210download 一.主机发现 1.netd ...
- 01_python基础(一)
python学习笔记,打算用五章介绍完python基础语法及基本用法. 开发环境: python3.7 推荐: https://github.com/jackfrued/Python-100- ...
- JS运算符类型
一.运算符类型 1.算术运算符: 用于各类数值运算,包括加(+).减(-).乘(*).除(/).求余(或称模运算,%).自增(++).自减(--)共七种. 2.关系运算符: 用于比较运算.包括大于(& ...
- Flask补充--threading.local对象
目录 Local 局部变量 全局变量 使用threading.local() 自定义threading.local 函数版 面向对象版 通过setattr和getattr实现 每个对象有自己的存储空间 ...
- deepin把vscode设为默认文本应用
一开始我想自己写一个desktop文件放在/usr/share/applications下面,结果在右键菜单里面找不到vscode. [Desktop Entry] Categories=Develo ...
- 英语cartialgenous鹿茸cartialgenous单词
鹿茸cartialgenous是雄鹿未骨化密生茸毛的幼角,主要从梅花鹿和马鹿头上采收,前者叫花鹿茸.黄毛茸,后者叫青毛茸.雄鹿到了一定年纪头上就会长角,初发时嫩如春笋,其表面上有一层纤细茸毛的嫩角就是 ...
- redis 配置及编写启动脚本
#!/bin/sh # # Simple Redis init.d script conceived to work on Linux systems # as it does use of the ...
- Qt我的文档 桌面路径
我的文档 QString location = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); 桌面 QStr ...