通过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 [email protected]
    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>"
                    [ -d "$dirName/$jarName" ] && rm -rf "$dirName/$jarName"
                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 [email protected]

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(StringUtils.format("<dependency>\n<groupId>{}</groupId>\n<artifactId>{}</artifactId>\n<version>{}</version>\n</dependency>", groupId, artifactId, version));
                                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(StringUtils.format("success: {}, failed: {}, sum: {}", successCount, notFoundList.size(), jarFilePaths.length));
            System.out.println(StringUtils.format("notFoundList: {}", notFoundList));
        }

ps:代码中的 StringUtils.format() 可能会有编译错误,是我自己封装的字符串拼接,主要是为了拼接字符串好看,改成普通的字符串拼接就行。

   public static String format(String str, Object... args) {
     return String.format(str.replaceAll("\\{\\}", "%s"), args);
   }

原文地址:https://www.cnblogs.com/zhangzongjian/p/11784930.html

时间: 2024-11-06 22:21:34

通过jar包名称,获取maven的依赖信息GAV的相关文章

maven命令mvn package指定jar包名称

在pom文件中添加<finalName>标签,标签内填写想要生成的jar包名称: <build> <finalName>eureka-server-1.2</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifac

Dev 日志 | 如何将 jar 包发布到 Maven 中央仓库

摘要 Maven 中央仓库并不支持直接上传?jar?包,因此需要将 jar?包发布到一些指定的第三方?Maven?仓库,比如:Sonatype OSSRH 仓库,然后该仓库再将 jar?包同步到?Maven?,本文详细记录整个发布.同步过程. 注册一个 Sonatype 用户 进入地址:https://issues.sonatype.org/secure/Signup!default.jspa?注册 Sonatype 用户,Sonatype 通过 JIRA(JIRA 是 Atlassian 公司

java打jar包与找不到依赖包详解

版权声明: https://blog.csdn.net/maoyuanming0806/article/details/82982263eclipse打jar包与找不到依赖包详解eclipse打工具jar1.项目右键-->export -->搜索java2.选择JAR file3.打包eclipse打包可执行jar1.项目右键-->export -->搜索java(参考上图)2.选择Runnable JAR file3.打包如下java命令行打包java -jar运行jar包找不到

添加jar包到本地Maven仓库

在使用Maven的过程中,经常碰到有些jar包在中央仓库没有的情况.如果公司有私服,那么就把jar包安装到私服上.如果没有私服,那就把jar包安装到本地Maven仓库.今天介绍2种安装jar包到本地Maven仓库的方法,下面进入正题. 一.使用Maven命令安装jar包 前提:在windows操作系统中配置好了Maven的环境变量,怎么配置请自己百度,这里不介绍,可参考https://jingyan.baidu.com/article/cb5d61050b8ee7005d2fe04e.html

maven工程打包成runnable的jar包,拷贝资源和依赖jar包

eclipse下新建maven工程,生成runnable的jar包.之前一直是手动拷贝依赖的jar包和资源文件,烦得要死.上网可劲查了一下.解决方案如下. 在pom的配置文件中做如下配置: <build> <finalName>...</finalName> <sourceDirectory>src/main/java</sourceDirectory> <resources> <!-- 控制资源文件的拷贝 --> <

maven 搜索不到想从本地仓库依赖的jar包--重建本地maven仓库索引

问题:有时候本地仓库有相关的jar包,但是在pom.xml中利用工具搜索不到 菜单栏设置显示Maven Respositorise视图:Windows--Show View--Other..   (对话框)Maven--Maven Respositorise 视图出现 选择Local Respositorises-->Local Respository 鼠标右键 Rebuild Index(重建索引) over...

部署Jar包到远程Maven仓库

在使用maven开发工程时,模块A可能会依赖模块B的jar包,如果两个模块都是在一个工程里,只需要在模块A的pom文件中加入模块B的依赖信息,模块A就可以加载模块B的jar包.但如果模块A与模块B在不同的工程,甚至是由不同的工程师开发,这时候就需要将模块B部署到远程仓库,模块A就可以在pom文件中通过配置远程仓库的地址来下载模块B的jar包了. 通常允许上传的远程仓库有两种:Snapshots和Releases,分别为快照版仓库和稳定版仓库.快照版仓库用于存放不稳定的开发包,稳定版仓库用于存放稳

Maven如何手动添加jar包到本地Maven仓库

Apache Maven,是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供.基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建.报告和文档等步骤.曾是Jakarta项目的子项目,现为独立Apache项目. 大家肯定遇到过想在pom文件中加入自己开发的依赖包,这些包肯定是不是在Maven仓库(http://repo1.maven.org/maven2/)的.那我们怎么将那些不存在Maven仓库中的包加入到本地的Maven库

ant脚本打jar包 自动获取时间以及项目svn版本号

1.关键代码,获取时间 <tstamp> <format property="touch.time" pattern="yyyy/MM/dd hh:mm" /> </tstamp> 2.获取本地svn版本 <target name="version" depends="init" > <typedef resource="com/googlecode/svntas