zoukankan      html  css  js  c++  java
  • maven本地库与私服比对,查找缺失jar包

    项目中遇到的一个问题,因为要切换开发环境(新环境不能联网,且私服上的jar包信息不全),需要将本地仓库(项目使用本地仓库能够正常编译)中有而私服上没有的jar包整理出来(名称、版本号等),提供给第三方,让其给添加进私服。

    举例如下,本地存在dubbo2.5.6的jar包信息,但私服上没有,需要提供给第三方,让其上传到私服。

    但是粗略估计,本地仓库中jar包数量在四位数以上,如果按照手动文件夹比对的方式来整理缺失jar包,将是一个极为繁重和无聊的任务。有什么准确又快的方法?

    我的方法来自于下面的启发:

    私服上的jar包访问路径和文件夹类似,当访问私服下存在的jar包目录时,状态200,而如果jar包在私服上不存在,那么就不会存在相应的地址,访问状态404.

     所以,遍历本地仓库下的所有jar包,根据其路径组装访问私服的url,如果访问成功,则说明私服上存在该jar包,否则即为不存在。

    代码如下

    package com.zang.scc.utils;
    
    import java.io.IOException;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.nio.file.FileVisitResult;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.nio.file.SimpleFileVisitor;
    import java.nio.file.attribute.BasicFileAttributes;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @author zang
     * @version zang: FindJar.java,v1.0 2019/3/11 22:02 zang Exp $$
     * @since 1.0
     */
    public class FindJar {
        public static void main(String[] args) throws Exception {
            Path startingDir = Paths.get("E:\java12\ProgRepository\maven_repository");
            FindFileVisitor findJavaVisitor = new FindFileVisitor(".jar");
            Files.walkFileTree(startingDir, findJavaVisitor);
            int i = 0;
            for (String urlAddress : findJavaVisitor.getFilenameList()) {
          //访问不成功,说明私服上不存在,打印出来
                if(200 != testConnection(urlAddress)){
                    System.out.println(i + ":" + urlAddress);
                    i++;
                }
            }
        }
    
        // 测试url是否联通的方法,联通则返回200,否则(包括3xx,5xx)返回默认404
        public static int testConnection(String address) throws Exception{
            int status = 404;
            try {
                URL urlObj = new URL(address);
                HttpURLConnection oc = (HttpURLConnection) urlObj.openConnection();
                oc.setUseCaches(false);
                oc.setConnectTimeout(3000);
                status = oc.getResponseCode();
                if(200 == status){
                    return status;
                }
            } catch (IOException e) {
                e.printStackTrace();
                throw e;
            }
            return status;
        }
    
    }
    
    class FindFileVisitor extends SimpleFileVisitor<Path> {
        private List<String> filenameList = new ArrayList<String>();
        private String fileSuffix = null;
      // 私服仓库公共包所在地址
        public static final String URL_ADDRESS = "http://10.2x3.xx.xxx:6xx0/nexus/content/groups/public";
      // 本地仓库地址
        public static final String JAR_DIR = "E:\java12\ProgRepository\maven_repository";
        public FindFileVisitor(String fileSuffix) {
            this.fileSuffix = fileSuffix;
        }
        // 遍历仓库下的所有文件,将jar包名称和版本号组装成访问私服的url
        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
            if (file.toString().endsWith(fileSuffix)) {
                //类似于http://10.2x3.xx.xxx:6xx0/nexus/content/groups/public/com/alibaba/dubbo/2.5.1/
                filenameList.add(file.getParent().toString().replace(JAR_DIR,URL_ADDRESS).replace("\","/"));
            }
            return FileVisitResult.CONTINUE;
        }
    
        public List<String> getFilenameList() {
            return filenameList;
        }
    
        public void setFilenameList(List<String> filenameList) {
            this.filenameList = filenameList;
        }
    }

    效果:

  • 相关阅读:
    Oracle诊断:在程序的运行中,有时候数据库会断开连接
    Linux shell
    Java继承和多态-Static关键字
    Oracle诊断:使用USER_SEGMENTS分配给表的物理空间大小
    Linux shell -查找字符(find,xargs,grep)
    Linux shell
    Linux shell
    Linux shell
    Java heap size
    Oracle诊断: 服务器启后,无法连接
  • 原文地址:https://www.cnblogs.com/zjfjava/p/10514207.html
Copyright © 2011-2022 走看看