一、背景

我们经常会遇到比较两个jar包的版本号,这里贴下相关实现。

二、方案

2.1 引用maven-artifact

org.apache.maven

maven-artifact

3.6.0

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 自己实现

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));

}

}

java jar 版本号,比较两个jar包的版本号相关推荐

  1. 如何对比两个Jar包

    如果对比两个jar包呢?jar 都是class 文件,我对比jar,就是想知道,它增加了删除了哪些方法.增加了哪些类,删除了哪些类. 有很多方法,你可以,反编译,然后通过beyongCompair 去 ...

  2. 关于两个jar包中存在包名和类名都完全相同的jar包冲突问题

    2019独角兽企业重金招聘Python工程师标准>>> 最近弄webservice,我使用的jdk自带的wsimport工具来生成客户端代码,发现生成的代码具有编译错误,错误描述如下 ...

  3. jar包不用java命令_使不能运行的JAR文件可以使用java -jar运行

    "); System.exit(0); } 请注重参数列表是如何被解释的,因为这对于后面的代码是非常重要的.参数的顺序和内容并不是硬性设置的,但是假如你改变它们也要记得适当的修改其他的代码. ...

  4. java mac jconsole_解决java maven项目找不到jconsole-1.8.0.jar和tools-1.8.0.jar包问题

    今天遇到了这样一种情况,自己的maven项目中并没有引用的jar包出现在了Maven Dependencies的依赖包中.而我在pom.xml自己没有没有引入啊. 图示 怀疑是自己的alibaba 的 ...

  5. java 压缩jar 仓库,java服务安装(一):使用java service wrapper及maven打zip包

    tags: java jsw maven zip 1.概述 使用java开发程序,在windows平台下,一般有web应用,后台服务应用,桌面应用: web应用多数打成war包在web容器(如tomc ...

  6. linux查看jar包内容命令,【达内Java教程】用linux查看jar包内文件命令

    深圳java培训(sz.java.tedu.cn)专家教你用linux查看jar包内文件命令 jar vtf fileName.jar 用法: jar {ctxui}[vfm0Me] [jar-fil ...

  7. [ERROR] 两个jar包中存在Qualified Name完全相同的引用冲突问题 解决方案

    分析:   最近在搞Jedis,在引入jedis-2.9.0.jar和commons-pool2-2.4.2.jar后初始化JedisPoolConfig时,发现很多属性无法设置(如最大空闲连接等)编 ...

  8. 单纯的Java项目打成一个可运行jar包或者普通依赖包

    写一个Java工具打成可运行jar包提供使用,或者普通依赖包. 目录 写一个Java工具打成可运行jar包提供使用,或者普通模块包. 方案一.打出的jar包里结果比较乱 方案二.依赖jar包打到外面, ...

  9. Java之 将程序打包成jar包

    准备材料: 1.java文件: Helloworld.java package com.ray; public class HelloWorld{public static void main(Str ...

最新文章

  1. activity生命周期及数据保存
  2. Docker与LXC、虚拟化技术的区别——虚拟化技术本质上是在模拟硬件,Docker底层是LXC,本质都是cgroups是在直接操作硬件...
  3. ------------------字节流---------------------
  4. Redis操作List类型
  5. 手机usb共享计算机网络连接,如何将手机wifi网络通过USB共享给电脑?小编教你共享方法...
  6. python turtle画房子详细解释_Python turtle 绘图入门必知必会
  7. css特效滑动导航栏,教你做个可爱的css滑动导航条
  8. Emacs,最强编辑器,没有之一
  9. html标签选择器只认最后一个,选择某类的最后一个元素——CSS3伪类选择器走过的坑...
  10. 抑郁症治疗过程中有哪些变化?
  11. [渝粤教育] 华中科技大学 模拟电子技术基础 参考 资料
  12. Excel技巧:如何用函数删除换行符、文本前空格、文本中间空格?
  13. win10系统桌面快捷方式图标变为白色方块如何解决
  14. 世界人工智能大会:互联网大佬透露了那些信息
  15. 逻辑回归(Logistic Regression):线性回归与逻辑回归的来龙去脉
  16. getReader()/getInputStream() has already been called for this request
  17. SpringBoot国际化失败的原因,切换中英文无效
  18. 程序媛的婆媳相处之道
  19. spark文本处理-文章分类
  20. 【嵌入式数据库原理与应用笔记】介绍,系统结构

热门文章

  1. vue怎么注释html代码,vue如何注释
  2. Spring Cloud与微服务学习总结(5)——认证鉴权与API权限控制在微服务架构中的设计与实现(三)
  3. Java Web学习总结(34)——拦截器和过滤器的差异总结
  4. 项目经理如何才能快速成长?
  5. Mysql学习总结(13)——使用JDBC处理MySQL大数据
  6. JS判断两个日期的差或者判断两个日期的大小
  7. 《C程序设计新思维》一6.3 不使用malloc的指针
  8. 恢复到特定点(时间点、scn、日志序列号),rman不完全恢复
  9. XenApp/XenDesktop 7.11 对于HDX 3D pro的2点增强
  10. Resharper进阶一:简要介绍