• 比较两个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));
        }
    }
    

      

     

  • 相关阅读:
    Linux Shell常用技巧(一)
    使用Native API 创建进程
    Windows操作系统下创建进程的过程
    Windows操作系统下创建进程的过程
    windows运行打开服务命令
    windows运行打开服务命令
    出错提示:“Could not flush the DNS Resolver Cache: 执行期间,函数出了问题”的解决方法
    出错提示:“Could not flush the DNS Resolver Cache: 执行期间,函数出了问题”的解决方法
    对XP上的KiFastSystemCall进行浅析
    对XP上的KiFastSystemCall进行浅析
  • 原文地址:https://www.cnblogs.com/waterystone/p/11385472.html
Copyright © 2020-2023  润新知