Поиск правильной версии JAR в репозитории maven
Я конвертирую сборку с 71 .jar
файлами в свой глобальный каталог lib/
для использования Maven. Конечно, они были вытащены из Интернета множеством разработчиков за последние десять лет истории этого проекта и не всегда добавлены в VCS со всей необходимой информацией о версии и т.д.
Есть ли простой, автоматический способ перехода из этого набора файлов .jar
в соответствующие элементы <dependency/>
для использования в моих файлах pom.xml
? Я надеюсь на веб-страницу, где я могу представить контрольную сумму файла jar и вернуть фрагмент XML. Гугл-хиты для поиска maven-репозитория в основном используют поиск по именам. И http://repo1.maven.org/ не имеет никакого поиска, насколько я вижу.
Обновление: GrepCode похоже, что он может найти проекты с учетом контрольной суммы MD5. Но он не содержит конкретных деталей (groupId
, artifactId
), которые нужны Maven.
Здесь script я пришел на основе принятого ответа:
#!/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
Ответы
Ответ 1
Jarvana может выполнять поиск в дайджесте (выберите дайджест рядом с полем ввода контента).
Например, поиск по d1dcb0fbee884bb855bb327b8190af36 вернет commons-collections-3.1.jar.md5
. Затем просто нажмите на
значок, чтобы получить детали (включая координаты maven).
Можно представить себе автоматизацию этого.
Ответ 2
Я был в той же ситуации, что и OP, но, как упоминалось в последующих ответах, Джарвана больше не работает.
Я использовал поиск по функциональности контрольной суммы Maven Central Search и их поиск api для достижения тех же результатов.
Сначала создайте файл с помощью sha1sums
sha1sum *.jar > jar-sha1sums.txt
затем используйте следующий python script, чтобы проверить, есть ли какая-либо информация о рассматриваемых баночках
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
Ответ 3
Jarvana больше не существует, однако вы можете использовать этот Groovy script, который будет перебирать каталог и искать хэш SHA1 для каждой банки в Nexus.
https://github.com/myspotontheweb/ant2ivy/blob/master/ant2ivy.groovy
Он создаст pom.xml для пользователей maven и ivy.xml для пользователей Ivy.
Ответ 4
Заимствовал код и идею от @Karl Tryggvason, но не смог заставить python script работать. Будучи обезьяной 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 и пройти через зависимость add, есть поиск, который использует индекс центрального центра.
Ответ 6
Если вы хотите использовать 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
Ответ 7
путь от куда баночка доступна
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'
https://gist.github.com/sachinsshetty/bab6ca24671cafe2cb63daaab47103f3
Ответ 8
Я создал скрипт, который поможет вам создать тег зависимостей pom.xml, если у вас есть папка, полная jar файлов. Часть этого основана на скрипте Karl Python.
Чтобы обнаружить эту информацию, скрипт делает следующее:
- Сначала он смотрит внутрь банки для META-INF/maven/
- затем он пытается найти банку по контрольной сумме SHA1 на search.maven.org
- затем, наконец, он помещает комментарий в файл pom.xml с информацией о манифесте jar, который поможет вам найти зависимость самостоятельно. Конечно, вы можете нигде не найти банку, и тогда вам придется разместить ее в своем собственном хранилище maven.
Вы можете получить его здесь: https://github.com/sjbotha/make-pom/
Ответ 9
Я создал скрипт, который поможет вам создать тег зависимостей pom.xml, если у вас есть папка, полная jar файлов.
Чтобы обнаружить эту информацию, скрипт делает следующее:
- Сначала он смотрит внутрь банки для META-INF/maven/
- затем он пытается найти банку по контрольной сумме SHA1 на search.maven.org
- затем, наконец, он помещает комментарий в файл pom.xml с информацией о манифесте jar, который поможет вам найти зависимость самостоятельно. Конечно, вы можете нигде не найти банку, и тогда вам придется разместить ее в своем собственном хранилище maven.
Вы можете получить его здесь: https://github.com/sjbotha/make-pom/
Ответ 10
Это тот же сценарий, что и в ответе @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()