通过jar包名称,获取maven的依赖信息GAV
烦恼:当我们手上有一堆三方件jar包,想要转成maven管理时,需要一个一个配置进pom文件中,而且GAV信息还得去收集。
为了快速生成如下信息,我们可以这样....
GAV:groupId + artifactId + version
<dependency>
<groupId></group>
<artifactId></artifactId>
<version></version>
</dependency>
1.通过解压jar包文件,从中提取GAV信息
原理:jar包中的pom.properties文件记录了GAV信息。(由于不是每个jar包都有pom.properties文件的,所以没有该文件的则查询不到。此时可以用方法2,或者手动上网搜索)
1.1 sh脚本方式(还是觉得脚本好用)
getGAV.sh /tmp/lib/javax.servlet-3.0.1.jar test/lib/javax.servlet-3.0.1.jar
参数传文件路径就行,支持多参数
#!/bin/bash ##获取jar包的maven依赖GAV信息 function main() { local notFoundList for var in $@ do if [ ! -z "$var" ];then local jarName=`echo $var | sed 's#.*/##' | sed 's#.jar##g'` local dirName=`dirname $var` [ ! -d "$dirName/$jarName" ] && unzip $var -d $dirName/$jarName &>/dev/null if [ -d "$dirName/$jarName" ];then local pomProperties=`find $dirName/$jarName -name pom.properties` if [ "$pomProperties" != "" ];then dos2unix $pomProperties &>/dev/null echo "<dependency>" echo "<groupId>"`grep "groupId" $pomProperties | cut -d'=' -f2`"</groupId>" echo "<artifactId>"`grep "artifactId" $pomProperties | cut -d'=' -f2`"</artifactId>" echo "<version>"`grep "version" $pomProperties | cut -d'=' -f2`"</version>" echo "</dependency>" else notFoundList="$var $notFoundList" fi [ -d "$dirName/$jarName" ] && rm -rf "$dirName/$jarName" else notFoundList="$var $notFoundList" fi fi done if [ "$notFoundList" != "" ];then echo "=============" echo "notFoundList: $notFoundList" echo "=============" fi } main $@
1.2 java方式
/** * 通过jar包文件解压,获取maven的依赖信息(GAV:groupId artifactId version) * * @param jarFilePaths jar包文件名或者全路径 */ public static void getGavFromJar(String... jarFilePaths) { List<String> notFoundList = new ArrayList<String>(); int successCount = 0; for (String jarFilePath : jarFilePaths) { File jarFile = new File(jarFilePath); if (jarFile.exists() && jarFile.isFile() && jarFilePath.endsWith(".jar")) { String groupId = ""; String artifactId = ""; String version = ""; // 不解压读取压缩包中的文件内容 try ( ZipInputStream zis = new ZipInputStream(new FileInputStream(jarFile)); ZipFile zipFile = new ZipFile(jarFile); ) { ZipEntry zipEntry; boolean hasPomProperties = false; while ((zipEntry = zis.getNextEntry()) != null) { if (zipEntry.getName().startsWith("META-INF/maven") && zipEntry.getName().endsWith("pom.properties")) { try ( BufferedReader br = new BufferedReader(new InputStreamReader(zipFile.getInputStream(zipEntry))); ) { String line; while ((line = br.readLine()) != null) { if (line.contains("=")) { String[] arrGVA = line.split("="); if (arrGVA.length > 1) { if ("groupId".equals(line.split("=")[0])) { groupId = line.split("=")[1]; } else if ("artifactId".equals(line.split("=")[0])) { artifactId = line.split("=")[1]; } else if ("version".equals(line.split("=")[0])) { version = line.split("=")[1]; } } } } hasPomProperties = true; System.out.println("<dependency>\n<groupId>" + groupId + "</groupId>\n<artifactId>" + artifactId + "</artifactId>\n<version>" + version + "</version>\n</dependency>"); successCount++; } catch (IOException e) { e.printStackTrace(); } break; } } if (!hasPomProperties) { notFoundList.add(jarFilePath); } } catch (IOException e) { e.printStackTrace(); } } else { notFoundList.add(jarFilePath); } } System.out.println(); System.out.println("success: " + successCount + ", failed: " + notFoundList.size() + ", sum: " + jarFilePaths.length)); System.out.println("notFoundList: " + notFoundList); }
2.通过jar包名称,获取maven的依赖信息GAV
原理:访问https://mvnrepository.com/search查询获取相关信息。(由于artifactId和version拿捏得不是百分百准确,所以查询准确率也不是百分百)
/** * 通过jar包名称,获取maven的依赖信息(GAV:groupId artifactId version) * @param jarFilePaths jar包文件名或者全路径 */ public static void getGavFromWeb(String... jarFilePaths) { List<String> notFoundList = new ArrayList<String>(); int successCount = 0; for(String jarFilePath : jarFilePaths) { if (!StringUtils.isEmpty(jarFilePath) && jarFilePath.endsWith(".jar")) { String searchUrl = "https://mvnrepository.com/search"; File jar = new File(jarFilePath); // 去掉.jar后缀 String jarName = jar.getName().substring(0, jar.getName().lastIndexOf(".")); // 去掉版本号,获取不一定准确的artifactId,用于关键字搜索 String artifactIdSimple = jarName.replaceAll("[-|_]\\d.*", ""); // 获取不一定准确的version,用于搜索结果筛选 String versionSimple = jarName.substring(artifactIdSimple.length()).replaceFirst("[-|_]", ""); try { Document doc = Jsoup.connect(searchUrl).data("q", artifactIdSimple).get(); Elements ps = doc.getElementsByClass("im-subtitle"); if (!CollectionUtils.isEmpty(ps)) { // artifactId搜索结果取第一条 Element p = ps.get(0); if (p.childNodeSize() > 1) { String artifactUrl = p.child(1).absUrl("href"); // 从search结果的超链接中截取groupId和artifactId String[] ids = artifactUrl.split("/"); String groupId = ids[ids.length - 2]; String artifactId = ids[ids.length - 1]; String version = ""; doc = Jsoup.connect(artifactUrl).get(); Elements as = doc.getElementsByClass("vbtn release"); // version搜索结果中取对应的,若无则取第一条 if (!CollectionUtils.isEmpty(as)) { if (!StringUtils.isEmpty(versionSimple)) { for (Element a : as) { if (versionSimple.equals(a.text())) { version = versionSimple; break; } } } if (StringUtils.isEmpty(version)) { version = as.get(0).text(); } } System.out.println("<dependency>\n<groupId>" + groupId + "</groupId>\n<artifactId>" + artifactId + "</artifactId>\n<version>" + version + "</version>\n</dependency>"); successCount++; } else { notFoundList.add(jarFilePath); } } else { notFoundList.add(jarFilePath); } } catch (IOException e) { e.printStackTrace(); notFoundList.add(jarFilePath); } } else { notFoundList.add(jarFilePath); } } System.out.println(); System.out.println("success: " + successCount + ", failed: " + notFoundList.size() + ", sum: " + jarFilePaths.length); System.out.println("notFoundList: " + notFoundList); }
为什么代码中这么多if-else呢,大概是为了提高容错率吧。
通过jar包名称,获取maven的依赖信息GAV的更多相关文章
- 获取类路径中含有beans.xml的jar包名称
获取类路径中含有beans.xml的jar包名称 package com.stono; import java.io.File; import java.io.IOException; import ...
- Dev 日志 | 如何将 jar 包发布到 Maven 中央仓库
摘要 Maven 中央仓库并不支持直接上传 jar 包,因此需要将 jar 包发布到一些指定的第三方 Maven 仓库,比如:Sonatype OSSRH 仓库,然后该仓库再将 jar 包同步到 Ma ...
- 如何将JAR包发布到Maven中央仓库?
将jar包发布到Maven中央仓库(Maven Central Repository),这样所有的Java开发者都可以使用Maven直接导入依赖,例如fundebug-java: <!-- ht ...
- 手动添加jar包到本地maven仓库
我们都知道使用maven管理jar包的时候,我们需要到远程仓库下载相关的jar包到本地仓库,但是如果远程仓库没有这个jar包呢?这时候我们就需要手动将jar包添加到本地仓库. 起因是我想用百度的富文本 ...
- java打jar包与找不到依赖包详解
eclipse打jar包与找不到依赖包详解 eclipse打工具jar 1.项目右键-->export -->搜索java 2.选择JAR file 3.打包 eclipse打包可执行ja ...
- 将jar包发布到maven中央仓库
将jar包发布到maven中央仓库 最近做了一个swagger-ui的开源项目,因为是采用vue进行解析swagger-json,需要前端支持,为了后端也能方便的使用此功能,所以将vue项目编译后的结 ...
- 如何手动把jar包添加进Maven本地仓库
有以下两种情况你需要手动通过Maven命令把jar文件添加进本地仓库: 1.在中心仓库里没有你想要的jar包. 2.你自己写了一个jar包,在其他项目要用到. 补充:现在仍有很多jar包不支持Mave ...
- 添加jar包到本地Maven仓库
在使用Maven的过程中,经常碰到有些jar包在中央仓库没有的情况.如果公司有私服,那么就把jar包安装到私服上.如果没有私服,那就把jar包安装到本地Maven仓库.今天介绍2种 ...
- 本地jar包添加至Maven仓库
Maven命令将本地的jar包方放到maven仓库中 //自定义本地的jar包在pom文件的参数 <dependency> <groupId>com.eee</group ...
随机推荐
- docker 学习操作记录 5-1
记录5-1 [BEGIN] // :: Connecting to ... Connection established. To escape to local shell, press Ctrl+A ...
- 前端与算法 leetcode 344. 反转字符串
目录 # 前端与算法 leetcode 344. 反转字符串 题目描述 概要 提示 解析 解法一:双指针 解法二:递归 算法 传入测试用例的运行结果 执行结果 GitHub仓库 # 前端与算法 lee ...
- 详解redis持久化
我们的Redis必须使用数据持久化吗?如果我们的Redis服务器只作为缓存使用,Redis中存储的所有数据都是从其他地方同步过来的备份,那么就没必要开启数据持久化的选项.Redis提供了将数据定期自动 ...
- 分享一个Linux C++消息通信框架TCPSHM
由于本人从事行业关系,Linux环境下的低延迟通信是我关注的技术之一.要达到极端的低延迟,当然同机器内IPC比网络通信快,而Linux IPC方式中无疑是共享内存延迟最低.不过相对于TCP这种通用的通 ...
- docker系列之三:docker实际应用
以Docker为基础完成持续集成.自动交付.自动部署: 原理: RD推送代码到git 仓库或者svn等代码服务器上面,git服务器就会通过hook通知jenkins. jenkine 克隆git代码到 ...
- tornado利用装饰器记录每个http请求
python利用装饰器记录每个http请求 设置装饰器 from functools import wraps from datetime import datetime ""&q ...
- Java学习:Set接口与HashSet集合存储数据的结构(哈希表)
Set接口 java.util.Set接口 extends Collection接口 Set接口的特点: 不允许存储重复的元素 没有索引,没有带索引的方法,也不能使用普通的for循环遍历 java.u ...
- 前端开发常用 JS 方法
1,获取文件本地url,在上传之前预览 /** * 获取图片嗯滴url,在上传之前预览 * @param file 选择的图片文件 * @returns {*} url */ getFileLocat ...
- (转)二步实现 远程连接 阿里云SqlServer 2012 数据库服务器
前言:在使用 阿里云 上的一些产品时,遇到不少坑. 安装IIS 时,遇到 因买的配置过低,虚拟内存不足,而导致 IIS 总是安装失败: 现在 在上面安装了个 Sql Sever 2012,远程老是 不 ...
- Eclipse集成Git做团队开发:代码管理
在日常开发工作中,我们通常使用版本控制软件管理团队的源代码,常用的SVN.Git.与SVN相比,Git有分支的概念,可以从主分支创建开发分支,在开发分支测试没有问题之后,再合并到主分支上去,从而避免了 ...