项目中遇到的一个问题,因为要切换开发环境(新环境不能联网,且私服上的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; } }
效果: