Поиск правильной версии правильного JAR в репозитории maven

Я конвертирую сборку с 71 .jar файлом в глобальном lib/ каталоге для использования Maven. Конечно, они были извлечены из Интернета многими разработчиками за последние десять лет истории этого проекта и не всегда добавлялись в VCS со всей необходимой информацией о версиях и т. Д.

Есть ли простой автоматизированный способ перехода от этого набора .jar файлов к соответствующим <dependency/> элементам для использования в моих pom.xml файлах? Я надеюсь на веб-страницу, где я могу отправить контрольную сумму файла jar и получить обратно фрагмент XML. Поисковые запросы Google для поиска в репозитории maven в основном просто находят поиск по имени. Насколько я понимаю, на http://repo1.maven.org/ вообще нет поиска.

Обновление: GrepCode похоже, что он может находить проекты с контрольной суммой MD5. Но он не предоставляет конкретных деталей (groupId, artifactId), которые нужны Maven.

Вот сценарий, который я придумал на основе принятого ответа:

#!/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

person Matt McHenry    schedule 17.06.2010    source источник
comment
Woohoo! Похоже на новую возможность для бизнеса.   -  person Fred Haslam    schedule 17.06.2010


Ответы (8)


Jarvana может выполнять поиск по дайджесту (выберите дайджест рядом с Поле ввода Содержание).

Например, поиск по значок alt text, чтобы получить подробную информацию (включая координаты maven).

Можно представить себе автоматизацию этого.

person Pascal Thivent    schedule 17.06.2010
comment
Но jarvana не работает (я думаю, навсегда?) - jarvana.blogspot.com есть ли альтернатива? - person ggb667; 16.01.2014
comment
Этот сайт не работает, см. jarvana.blogspot.com/2013/08/goodbye- jarvana.html - person JuanMoreno; 12.12.2019

Я был в той же ситуации, что и OP, но, как упоминалось в более поздних ответах, Джарвана больше не встал.

Я использовал функцию поиска по контрольной сумме Maven Central Search и их api поиска для достижения тех же результатов.

Сначала создайте файл с sha1sums

sha1sum *.jar > jar-sha1sums.txt

затем используйте следующий скрипт python, чтобы проверить, есть ли какая-либо информация о рассматриваемых банках

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

person Karl Tryggvason    schedule 20.05.2014
comment
Чтобы использовать предыдущий скрипт в Python 3, нам нужно изменить следующее: Строка 2 на: from urllib.request import urlopen, Строки 11 и 12 на: page = urlopen (searchurl) data = json.loads (b.join (page. readlines ())) и строка 21 с: print (для + jar информация не найдена) - person JuanMoreno; 28.09.2018

Jarvana больше не существует, однако вы можете использовать этот скрипт Groovy, который будет перебирать каталог и искать хэш SHA1 для каждой банки в Nexus. https://github.com/myspotontheweb/ant2ivy/blob/master/ant2ivy.groovy

Он создаст pom.xml для пользователей maven и ivy.xml для пользователей Ivy.

person opticyclic    schedule 22.01.2014

Позаимствовал код и идею у @Karl Tryggvason, но не смог заставить работать скрипт python. Будучи Windows-обезьяной, я сделал что-то подобное в Powershell (требуется v3), не такой изощренный (не генерирует помпу, а просто сбрасывает результаты), но я подумал, что это может кому-то сэкономить несколько минут.

$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
}
person Dave Gregory    schedule 17.12.2014

Привет, вы можете использовать mvnrepository для поиска артефактов, или вы можете использовать Eclipse и пройти через зависимость добавления, есть поиск, который используя индекс maven central.

person khmarbaise    schedule 17.06.2010

Если вы хотите использовать artifactId и версию имени, прочитанного из jar, вы можете использовать следующий код. Это импровизированная версия Карла.

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.

person kn_pavan    schedule 27.12.2016

путь, откуда доступна банка

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`

gist создан на основе скрипта ant2maven @ https://github.com/sachinsshetty/ant2Maven.git

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

person sachin s shetty    schedule 20.08.2018

Это тот же сценарий, который формирует ответ на @ 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()
person JuanMoreno    schedule 30.08.2019