Нахождение правильной версии правильного JAR в репозитории maven - PullRequest
17 голосов
/ 17 июня 2010

Я конвертирую сборку с 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

Ответы [ 7 ]

4 голосов
/ 20 мая 2014

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

Я использовал функцию поиска по контрольной сумме 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

4 голосов
/ 17 июня 2010

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

Например, поиск по d1dcb0fbee884bb855bb327b8190af36 вернет commons-collections-3.1.jar.md5.Затем просто нажмите на значок alt text http://www.jarvana.com/jarvana/p.gif, чтобы получить подробную информацию (включая координаты maven).

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

2 голосов
/ 17 декабря 2014

Заимствовал код и идею у @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
}
2 голосов
/ 22 января 2014

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

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

0 голосов
/ 20 августа 2018

путь от места хранения баночки

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

0 голосов
/ 27 декабря 2016

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

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

0 голосов
/ 17 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...