通过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 ...
随机推荐
- linux下安装谷歌拼音输入法
linux下安装谷歌拼音输入法 输入以下命令,等待安装完成. sudo apt-get install fcitx 接着输入,完成安装谷歌中文输入法 sudo apt-get install fcit ...
- 【Appium + Python + WebviewH5】之微信小程序自动化测试
进行调试,打开X5: http://debugmm.qq.com/?forcex5=true http://debugx5.qq.com http://debugtbs.qq.com 一般前两个就可以 ...
- 排序算法Java代码实现(一)—— 选择排序
以下几篇随笔都是记录的我实现八大排序的代码,主要是贴出代码吧,讲解什么的都没有,主要是为了方便我自己复习,哈哈,如果看不明白,也不要说我坑哦! 本片分为两部分代码: 常用方法封装 排序算法里需要频繁使 ...
- SecureCRT上传本地文件到linux
1.使用crt登录到需要操作的linux系统 2.按Alt+P打开sftp传输界面 3.输入pur指令加文件路径,例如:put E://srs-3.0.zip按enter就可以 4.再返回crt界面, ...
- C#基础语法,快速上収C#
C#代码基础语法 对新手的帮助很大,可以尝试多看看然后在敲敲 // 单行注释以 // 开始 /* 多行注释是这样的 */ /// <summary> /// XML文档注释 /// < ...
- python numPy模块 与numpy里的数据类型、数据类型对象dtype
学习链接:http://www.runoob.com/numpy/numpy-tutorial.html 官方链接:https://numpy.org/devdocs/user/quickstart. ...
- 使用Nexus3搭建Maven私服+上传第三方jar包到本地maven仓库
1.搭建Maven私服背景 公司还是按捺不住,要搭建一个自己的Maven本地仓库,可以让开发人员down架包,从内网还是快很多. 这样公司的maven本地仓库就是 开发人员自己电脑上的maven仓库 ...
- Nginx中的break和last
rewrite中的break和last 两个指令用法相同,但含义不同,需要放到rewrite规则的末尾,用来控制重写后的链接是否继续被nginx配置执行(主要是rewrite.return指令). 示 ...
- 【转载】C#通过遍历DataTable的列获取所有列名
在C#中的Datatable数据变量的操作过程中,可以通过遍历DataTable的所有列对象Columns属性,来获取DataTable中的所有列名信息,DataTable中所有列的对象信息都存储在D ...
- 使用node+vue实现简单的WebSocket聊天功能
最近学习了一下websocket的即时通信,感觉非常的强大,这里我用node启动了一个服务进行websocket链接,然后再vue的view里面进行了链接,进行通信,废话不多说,直接上代码吧, 首先, ...