2010-06-17 34 views
16

Tôi đang chuyển đổi một bản dựng có 71 .jar tệp trong thư mục lib/ toàn cầu của mình để sử dụng Maven. Tất nhiên, những điều này đã bị lôi kéo từ web bởi nhiều nhà phát triển trong mười năm qua của lịch sử của dự án này và không phải lúc nào cũng được thêm vào VCS với tất cả thông tin phiên bản cần thiết, v.v.Tìm phiên bản đúng của JAR phù hợp trong kho lưu trữ maven

Có dễ dàng không, cách tự động để chuyển từ tập hợp các tệp .jar này thành các phần tử <dependency/> tương ứng để sử dụng trong các tệp pom.xml của tôi? Tôi hy vọng cho một trang web mà tôi có thể gửi tổng kiểm tra của một tệp jar và lấy lại một đoạn mã XML. Các truy cập google cho 'tìm kiếm kho lưu trữ maven' về cơ bản chỉ là tìm kiếm dựa trên tên. Và http://repo1.maven.org/ không có tìm kiếm nào, theo như tôi thấy.

Cập nhật: GrepCode có vẻ như nó có thể tìm thấy các dự án được kiểm tra MD5. Nhưng nó không cung cấp các chi tiết cụ thể (groupId, artifactId) mà Maven cần.

Dưới đây là kịch bản tôi đã đưa ra dựa trên các câu trả lời được chấp nhận:

#!/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! Có vẻ như một cơ hội kinh doanh mới. –

Trả lời

4

Jarvana có thể tìm kiếm trên tiêu hóa (chọn tiêu hóa bên cạnh các lĩnh vực đầu vào Content).

Ví dụ: tìm kiếm trên d1dcb0fbee884bb855bb327b8190af36 sẽ trả lại commons-collections-3.1.jar.md5. Sau đó, chỉ cần nhấp vào biểu tượng alt text http://www.jarvana.com/jarvana/p.gif để biết chi tiết (bao gồm cả tọa độ maven).

Người ta có thể tưởng tượng tự động hóa việc này.

+0

Nhưng jarvana là xuống (tôi nghĩ vĩnh viễn?) - http://jarvana.blogspot.com/ là có một thay thế? – ggb667

0

Hi bạn có thể sử dụng mvnrepository để tìm kiếm các hiện vật hoặc bạn có thể sử dụng Eclipse và đi qua các add phụ thuộc có một tìm kiếm đó là bằng cách sử dụng chỉ số của maven trung tâm.

2

Tôi đã ở trong tình trạng tương tự như OP, nhưng như đã đề cập trong câu trả lời sau Jarvana không còn lên.

Tôi đã sử dụng chức năng tìm kiếm theo chức năng kiểm tra của Maven Central Searchsearch api để đạt được kết quả tương tự.

Đầu tiên tạo một file với sha1sums

sha1sum *.jar > jar-sha1sums.txt 

sau đó sử dụng các tập lệnh python sau để kiểm tra nếu có bất kỳ thông tin về các lọ trong câu hỏi

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

mượn mã và ý tưởng từ @Karl Tryggvason nhưng không thể nhận được kịch bản python làm việc. Là một con khỉ Windows Tôi đã làm một cái gì đó tương tự trong Powershell (v3 yêu cầu), không quá tinh vi (không tạo ra cho bạn một pom, chỉ kết xuất bãi) nhưng tôi nghĩ rằng nó có thể tiết kiệm một vài phút.

$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

Nếu bạn muốn sử dụng artifactId và phiên bản đọc từ tên jar, bạn có thể sử dụng mã sau. Đó là phiên bản ngẫu hứng của 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:]) 

Mã cũng có thể được tìm thấy trên GitHub

Các vấn đề liên quan