【问题标题】:Finding the right version of the right JAR in a maven repository在 Maven 存储库中找到正确 JAR 的正确版本
【发布时间】:2010-06-17 15:37:53
【问题描述】:

我正在将一个在其全局 lib/ 目录中包含 71 个 .jar 文件的构建转换为使用 Maven。当然,在该项目的过去十年历史中,许多开发人员从网络上提取了这些内容,并且并不总是将所有必要的版本信息等添加到 VCS 中。

是否有一种简单、自动化的方法可以从这组 .jar 文件转到相应的 <dependency/> 元素以在我的 pom.xml 文件中使用?我希望有一个网页,我可以在其中提交 jar 文件的校验和并取回 XML sn-p。 “maven 存储库搜索”的谷歌点击基本上只是查找基于名称的搜索。据我所知,http://repo1.maven.org/ 没有任何搜索。

更新:GrepCode 看起来它可以找到给定 MD5 校验和的项目。但它没有提供 Maven 需要的特定细节(groupIdartifactId)。

这是我根据接受的答案提出的脚本:

#!/bin/bash

for f in *.jar; do
    s=`md5sum $f | cut -d ' ' -f 1`;
    p=`wget -q -O - "http://www.jarvana.com/jarvana/search?search_type=content&content=${s}&filterContent=digest" | grep inspect-pom | cut -d \" -f 4`;
    pj="http://www.jarvana.com${p}";
    rm -f tmp;
    wget -q -O tmp "$pj";

    g=`grep groupId tmp | head -n 1 | cut -d \> -f 3 | cut -d \< -f 1`;
    a=`grep artifactId tmp | head -n 1 | cut -d \> -f 3 | cut -d \< -f 1`;
    v=`grep version tmp | head -n 1 | cut -d \> -f 3 | cut -d \< -f 1`;
    rm -f tmp;

    echo '<dependency> <!--' $f $s $pj '-->';
    echo "  <groupId>$g</groupId>";
    echo "  <artifactId>$a</artifactId>";
    echo "  <version>$v</version>";
    echo "</dependency>";
    echo;
done

【问题讨论】:

  • 哇哦!看起来像是一个新的商机。

标签: maven-2


【解决方案1】:

我和 OP 处于同样的情况,但正如后面的回答中提到的那样,Jarvana 已经不在了。

我使用了Maven Central Search 及其search api 的校验和搜索功能来获得相同的结果。

首先使用 sha1sums 创建一个文件

sha1sum *.jar > jar-sha1sums.txt

然后使用下面的python脚本来检查有问题的jars是否有任何信息

import json
import urllib2

f = open('./jar-sha1sums.txt','r')
pom = open('./pom.xml','w')
for line in f.readlines():
    sha = line.split("  ")[0]
    jar = line.split("  ")[1]
    print("Looking up "+jar)
    searchurl = 'http://search.maven.org/solrsearch/select?q=1:%22'+sha+'%22&rows=20&wt=json'
    page = urllib2.urlopen(searchurl)
    data = json.loads("".join(page.readlines()))
    if data["response"] and data["response"]["numFound"] == 1:
        print("Found info for "+jar)
        jarinfo = data["response"]["docs"][0]
        pom.write('<dependency>\n')
        pom.write('\t<groupId>'+jarinfo["g"]+'</groupId>\n')
        pom.write('\t<artifactId>'+jarinfo["a"]+'</artifactId>\n')
        pom.write('\t<version>'+jarinfo["v"]+'</version>\n')
        pom.write('</dependency>\n')
    else:
        print "No info found for "+jar
        pom.write('<!-- TODO Find information on this jar file--->\n')
        pom.write('<dependency>\n')
        pom.write('\t<groupId></groupId>\n')
        pom.write('\t<artifactId>'+jar.replace(".jar\n","")+'</artifactId>\n')
        pom.write('\t<version></version>\n')
        pom.write('</dependency>\n')
pom.close()
f.close()

YMMV

【讨论】:

  • 要在 python 3 中使用之前的脚本,我们需要更改以下内容:第 2 行:from urllib.request import urlopen,第 11 和 12 行:page = urlopen(searchurl) data = json。 load(b"".join(page.readlines())) 和第 21 行: print ("No info found for "+jar)
【解决方案2】:

Jarvana 可以搜索摘要(选择 Content 输入字段旁边的 digest)。

例如,搜索 d1dcb0fbee884bb855bb327b8190af36 将返回 commons-collections-3.1.jar.md5。然后只需点击 图标以获取详细信息(包括 maven 坐标)。

可以想象自动化这个过程。

【讨论】:

【解决方案3】:

Jarvana 不再存在,但是,您可以使用这个 Groovy 脚本来遍历目录并在 Nexus 中查找每个 jar 的 SHA1 哈希。 https://github.com/myspotontheweb/ant2ivy/blob/master/ant2ivy.groovy

它将为 maven 用户创建一个 pom.xml,为 Ivy 用户创建一个 ivy.xml。

【讨论】:

    【解决方案4】:

    从@Karl Tryggvason 借用了代码和想法,但无法让 python 脚本正常工作。作为一个 Windows 猴子,我在 Powershell 中做了类似的事情(需要 v3),不是那么复杂(不会为您生成 pom,只是转储结果),但我认为它可能会节省一些人的时间。

    $log = 'c:\temp\jarfind.log'
    
    Get-Date | Tee-Object -FilePath $log
    
    $jars = gci d:\source\myProject\lib -Filter *.jar
    
    foreach ($jar in $jars)
    {
        $sha = Get-FileHash -Algorithm SHA1 -Path $jar.FullName | select -ExpandProperty hash
        $name = $jar.Name
        $json = Invoke-RestMethod "http://search.maven.org/solrsearch/select?q=1:%22$($sha)%22&rows=20&wt=json"
        "Found $($json.response.numfound) jars with sha1 matching that of $($name)..." | Tee-Object -FilePath $log -Append
        $jarinfo = $json.response.docs
        $jarinfo | Tee-Object -FilePath $log -Append
    }
    

    【讨论】:

      【解决方案5】:

      您好,您可以使用 mvnrepository 搜索工件,或者您可以使用 Eclipse 并通过添加依赖项进行搜索,该搜索使用 maven Central 的索引。

      【讨论】:

        【解决方案6】:

        如果要使用从 jar 名称读取的 artifactId 和版本,可以使用以下代码。这是Karl's的即兴版本。

        import os
        import sys
        from subprocess import check_output
        
        import requests
        
        def searchByShaChecksum(sha):
          searchurl = 'http://search.maven.org/solrsearch/select?q=1:%22' + sha + '%22&rows=20&wt=json'
          resp = requests.get(searchurl)
          data = resp.json()
          return data
        
        
        def searchAsArtifact(artifact, version):
          searchurl = 'http://search.maven.org/solrsearch/select?q=a:"' + artifact + '" AND v:"' + version.strip() + '"&rows=20&wt=json'
          resp = requests.get(searchurl)
          # print(searchurl)
          data = resp.json()
          return data
        
        
        def processAsArtifact(file: str):
          data = {'response': {'start': 0, 'docs': [], 'numFound': 0}}
          jar = file.replace(".jar", "")
          splits = jar.split("-")
          if (len(splits) < 2):
            return data
          for i in range(1, len(splits)):
            artifact = "-".join(splits[0:i])
            version = "-".join(splits[i:])
            data = searchAsArtifact(artifact, version)
            if data["response"] and data["response"]["numFound"] == 1:
              return data
          return data
        
        
        def writeToPom(pom: object, grp: str = None, art: str = None, ver: str = None):
          if grp is not None and ver is not None:
            pom.write('<dependency>\n')
          else:
            pom.write('<!-- TODO Find information on this jar file--->\n')
            pom.write('<dependency>\n')
          grp = grp if grp is not None else ""
          art = art if art is not None else ""
          ver = ver if ver is not None else ""
          pom.write('\t<groupId>' + grp + '</groupId>\n')
          pom.write('\t<artifactId>' + art + '</artifactId>\n')
          pom.write('\t<version>' + ver + '</version>\n')
          pom.write('</dependency>\n')
        
        
        def main(argv):
          if len(argv) == 0:
            print(bcolors.FAIL + 'Syntax : findPomJars.py <lib_dir_path>' + bcolors.ENDC)
          lib_home = str(argv[0])
          if os.path.exists(lib_home):
            os.chdir(lib_home)
        
            pom = open('./auto_gen_pom_list.xml', 'w')
            successList = []
            failedList = []
            jarCount = 0
            for lib in sorted(os.listdir(lib_home)):
              if lib.endswith(".jar"):
                jarCount += 1
                sys.stdout.write("\rProcessed Jar Count: %d" % jarCount)
                sys.stdout.flush()
                checkSum = check_output(["sha1sum", lib]).decode()
                sha = checkSum.split("  ")[0]
                jar = checkSum.split("  ")[1].strip()
                data = searchByShaChecksum(sha)
                if data["response"] and data["response"]["numFound"] == 0:
                  data = processAsArtifact(jar)
        
                if data["response"] and data["response"]["numFound"] == 1:
                  successList.append("Found info for " + jar)
                  jarinfo = data["response"]["docs"][0]
                  writeToPom(pom, jarinfo["g"], jarinfo["a"], jarinfo["v"])
                else:
                  failedList.append("No info found for " + jar)
                  writeToPom(pom, art=jar.replace(".jar\n", ""))
            pom.close()
        
            print("\n")
            print("Success : %d" % len(successList))
            print("Failed : %d" % len(failedList))
        
            for entry in successList:
              print(entry)
            for entry in failedList:
              print(entry)
        
          else:
            print
            bcolors.FAIL + lib_home, " directory doesn't exists" + bcolors.ENDC
        
        
        if __name__ == "__main__":
          main(sys.argv[1:])
        

        代码也可以在GitHub上找到

        【讨论】:

          【解决方案7】:

          jar 可用的路径

          jar_name=junit-4.12.jar
          
          sha1sum $jar_name > jar-sha1sums.txt
          
          shaVal=`cat jar-sha1sums.txt | cut -d " " -f1`
          
          response=$(curl -s 'http://search.maven.org/solrsearch/select?q=1:%22'$shaVal'%22&rows=20&wt=json')
          
          formatted_response=`echo $response | grep -Po '"response":*.*'`
          
          versionId=`echo $formatted_response | grep -Po '"v":"[0-9]*.[0-9]*"' | cut -d ":" -f2| xargs`
          
          artifactId=`echo $formatted_response | grep -Po '"a":"[a-z]*"' | cut -d ":" -f2 | xargs`
          
          groupId=`echo $formatted_response |   grep -Po '"g":"[a-z]*"' | cut -d ":" -f2 | xargs`
          

          查找最新的可用版本

          lat_ver_response=$(curl -s https://search.maven.org/solrsearch/select?q=g:"$groupId"+AND+a:"$artifactId"&core=gav&rows=20&wt=json)
          
          format_lat_ver_response=`echo $lat_ver_response | grep -Po '"response":*.*'`
          
          latestVersionId=`echo $format_lat_ver_response | grep -Po '"latestVersion":"[0-9]*.[0-9]*"' | cut -d ":" -f2| xargs`
          

          从 ant2maven 脚本创建的要点@https://github.com/sachinsshetty/ant2Maven.git

          https://gist.github.com/sachinsshetty/bab6ca24671cafe2cb63daaab47103f3

          【讨论】:

            【解决方案8】:

            这是与@karl-tryggvason 的答案相同的脚本,但使用的是 Python 3:

            import json
            from urllib.request import urlopen
            f = open('./jar-sha1sums.txt','r')
            pom = open('./pom.xml','w')
            for line in f.readlines():
                sha = line.split(" ")[0]
                jar = line.split(" ")[1]
                print("Looking up "+jar)
                searchurl = 'http://search.maven.org/solrsearch/select?q=1:%22'+sha+'%22&rows=20&wt=json'
                page = urlopen(searchurl)
                data = json.loads(b"".join(page.readlines()))
                if data["response"] and data["response"]["numFound"] == 1:
                    print("Found info for "+jar)
                    jarinfo = data["response"]["docs"][0]
                    pom.write('<dependency>\n')
                    pom.write('\t<groupId>'+jarinfo["g"]+'</groupId>\n')
                    pom.write('\t<artifactId>'+jarinfo["a"]+'</artifactId>\n')
                    pom.write('\t<version>'+jarinfo["v"]+'</version>\n')
                    pom.write('</dependency>\n')
                else:
                    print ("No info found for "+jar)
                    pom.write('<!-- TODO Find information on this jar file--->\n')
                    pom.write('<dependency>\n')
                    pom.write('\t<groupId></groupId>\n')
                    pom.write('\t<artifactId>'+jar.replace(".jar\n","")+'</artifactId>\n')
                    pom.write('\t<version></version>\n')
                    pom.write('</dependency>\n')
            pom.close()
            f.close()
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-03-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-22
              • 2018-09-28
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多