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

效果:

maven本地库与私服比对,查找缺失jar包的更多相关文章

  1. Maven入门:使用Nexus搭建Maven私服及上传下载jar包

    一. 私服搭建及配置 1 . 私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓 ...

  2. Nexus-在项目中使用Maven私服,Deploy到私服、上传第三方jar包、在项目中使用私服jar包

    场景 Ubuntu Server 上使用Docker Compose 部署Nexus(图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/ ...

  3. Maven 官网 查找&下载 jar包& pom引用 完美方案

    Maven 官网 查找&下载 jar包 & pom引用 问题描述 在我们在开发过程中,经常遇到程序中需要引用的某个版本jar包,但是在公司的私有仓库下载不到的情况. 遇到这种情况,该怎 ...

  4. 使用Sonatype Nexus搭建Maven私服后,如何添加第三方JAR包

    使用Sonatype Nexus搭建Maven私服后如何添加第三方JAR包 步骤如下 1.打开nexus地址,进行登录 2.登录Nexus后,点击右侧的“Repositories”,显示当前Nexus ...

  5. 只要项目是maven构建的,pom.xml中依赖的jar包全都默认去你电脑本地仓库去找

    只要项目是maven构建的,pom.xml中依赖的jar包全都默认去你电脑本地仓库去找

  6. maven 本地仓库无法更新到最新版本的jar包

    maven 本地仓库无法更新到最新版本的jar包 描述:maven 本地仓库无法更新最新版的jar包导致项目一直报错 解决:去jar包版本所在目录,删除掉所有红框内文件,重新用ide导入

  7. maven私服nexus上传第三方jar包以及下载

    私服是一个特殊的远程仓库,它是架设在局域网内的仓库服务.私服代理广域网上的远程仓库,供局域网内的Maven用户使用.当Maven需要下载构建的使用,它先从私服请求,如果私服上没有的话,则从外部的远程仓 ...

  8. Maven整合Spring3.0+Mybatis3.2+Struts2.3+查找坐标+jar包依赖(五)

    依赖传递 只添加了一个struts2-core依赖,发现项目中出现了很多jar,这种情况 叫 依赖传递

  9. 使用Sonatype Nexus搭建Maven私服后如何添加第三方JAR包?

    Sonatype Nexus简介 登录Nexus后,点击右侧的“Repositories”,显示当前Nexus所管理的Repository: 默认情况下Nexus为我们创建了以下主要的Reposito ...

随机推荐

  1. springbank 开发日志 阅读spring mvc的源代码真是受益良多

    决定模仿spring mvc的dispatcher->handlerMapping(return executorChain)->handler.execute 这样的流程之后,就开始看s ...

  2. 存储过程,存储函数(Oracle)

    存储过程和存储函数 指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数. 存储过程和存储函数的区别? 存储函数:可以通过return 语句返回函数值. 存储过程:不能 除此之外我们可以认为 ...

  3. BZOJ1053 [HAOI2007]反素数ant 数论

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 传送门 - BZOJ1053 题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正 ...

  4. Repository HDU2846

    极限过的 最原始的方法一层一层建树就好了 #include<bits/stdc++.h> using namespace std; ][]={}; ]={}; ]; ; int pos; ...

  5. C#资源管理器

    窗体搭建:ContextMenuStrip右键菜单,Treeview树形菜单,Listview控件 新建"我的文件"类: public class MyFile { public ...

  6. linux 重要笔记

    nginx 服务器重启命令,关闭   nginx -s reload  :修改配置后重新加载生效 nginx -s reopen  :重新打开日志文件nginx -t -c /path/to/ngin ...

  7. HDU4372-Count the Buildings【第一类Stirling数】+【组合数】

    <题目链接> <转载于 >>> > 题目大意: N座高楼,高度均不同且为1~N中的数,从前向后看能看到F个,从后向前看能看到B个,问有多少种可能的排列数. 0 ...

  8. C++雾中风景番外篇2:Gtest 与 Gmock,聊聊C++的单元测试

    正式工作之后,公司对于单元测试要求比较严格.(笔者之前比较懒,一般很少写完整的单测~~).作为一个合格的开发工程师,需要为所编写代码编写适量的单元测试是十分必要的,在实际进行的开发工作之中,TDD(T ...

  9. JS-排序详解-选择排序

    说明 时间复杂度指的是一个算法执行所耗费的时间 空间复杂度指运行完一个程序所需内存的大小 稳定指,如果a=b,a在b的前面,排序后a仍然在b的前面 不稳定指,如果a=b,a在b的前面,排序后可能会交换 ...

  10. flask第九篇——url_for【2】

      上一节说的是没有参数的url_for,如果没有参数,可以直接url_for('函数名')那如果我们构造的函数是: @app.route('/login/<page_id>/')def ...