代码之家  ›  专栏  ›  技术社区  ›  Matt McHenry

在Maven存储库中查找正确的JAR版本

  •  17
  • Matt McHenry  · 技术社区  · 14 年前

    我正在转换一个有71个 .jar 全局文件 lib/ 使用maven的目录。当然,在这个项目的过去十年中,很多开发人员已经从网络上提取了这些内容,而且这些内容并不总是添加到具有所有必要版本信息等的VCS中。

    有没有一个简单的,自动化的方法从那套 罐子 文件到相应的 <dependency/> 用于我的 pom.xml 文件夹?我希望有一个网页,在那里我可以提交JAR文件的校验和,并得到一个XML片段。“maven储存库搜索”的谷歌搜索结果基本上只是基于名称的搜索。和 http://repo1.maven.org/ 据我所见,没有任何搜索。

    更新: GrepCode 看起来它可以找到给定MD5校验和的项目。但它没有提供具体细节( groupId , artifactId )那小牛需要的。

    以下是我根据接受的答案得出的脚本:

    #!/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
    
    7 回复  |  直到 6 年前
        1
  •  4
  •   Pascal Thivent    14 年前

    Jarvana 可以搜索摘要(选择 消化 紧挨着 内容 输入字段)。

    例如,搜索 d1dcb0fbee884bb855bb327b8190af36 将返回 commons-collections-3.1.jar.md5 . 然后点击 alt text http://www.jarvana.com/jarvana/p.gif 获取详细信息的图标(包括Maven坐标)。

    我们可以想象自动化。

        2
  •  4
  •   Karl Tryggvason    10 年前

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

    我使用了“按校验和搜索”功能 Maven Central Search 及其 search api 达到同样的效果。

    首先用sha1命令创建一个文件

    sha1sum *.jar > jar-sha1sums.txt
    

    然后使用下面的python脚本检查JAR上是否有任何相关信息

    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()
    

    牛传染性胃肠炎病毒

        3
  •  2
  •   opticyclic    11 年前

    然而,jarvana已经不存在了,您可以使用这个groovy脚本,它将遍历一个目录并在nexus中查找每个jar的sha1散列。 https://github.com/myspotontheweb/ant2ivy/blob/master/ant2ivy.groovy

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

        4
  •  2
  •   Dave Gregory    10 年前

    借用了@karl tryggvason的代码和想法,但无法使python脚本正常工作。作为一个WindowsMonkey,我在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
  •  0
  •   khmarbaise    14 年前

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

        6
  •  0
  •   Community Marino Di Clemente    7 年前

    如果要使用artifactid和从jar名称读取的版本,可以使用以下代码。这是一个临时版本的 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
  •  0
  •   sachin s shetty    6 年前

    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脚本创建的gist@ https://github.com/sachinsshetty/ant2Maven.git

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