2010-06-17 2 views
16

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

Есть ли простой, автоматический способ перехода от этого набора файлов .jar к соответствующим элементам <dependency/> для использования в моих pom.xml файлах? Я надеюсь на веб-страницу, где я могу представить контрольную сумму файла jar и вернуть фрагмент XML. Гугл-хиты для поиска 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 
+0

Woohoo! Похож на новую деловую возможность. –

ответ

4

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

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

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

+0

Но jarvana не работает (я думаю, постоянно?) - http://jarvana.blogspot.com/ есть ли альтернатива? – ggb667

0

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

2

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

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

+0

Я получаю ошибку http 403 –

2

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

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

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

sha1sum *.jar > jar-sha1sums.txt 

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

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

2

заимствовал кода и идеи от @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 
} 
0

Если вы хотите использовать 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

Смежные вопросы