簡體   English   中英

如果清單中未提及,如何查找Jar版本

[英]How to find version of Jar if not mentioned in Manifest

我有一個項目,其中簽入了許多JARS,但沒有針對它們的版本信息。

我必須使用Apache Ivy來實現依賴關系管理,但是我不知道在ivy.xml要指向哪個版本。 我檢查了清單,其中許多沒有此處提到的JAR版本。

還有另一種方法來查找JARS版本嗎? 我知道查找校驗和並進行比較是另一種選擇,但是為此,我需要對照所有可能的JAR版本的校驗和檢查每個JAR,因此這不是一個選擇。

還有其他建議嗎?

我會說-沒有別的辦法。 如果某個地方有所有jar版本(所涉及的庫),則可以對它們進行md5運算,然后與您擁有的未知jar版本的md5總和進行比較。 我可能是錯的,但沒有其他辦法。

要添加到以前的評論中,您可以在http://search.maven.org/#api上找到有關Maven REST API的詳細信息。 您在此處感興趣的URL是http://search.maven.org/solrsearch/select?q=1:“SHA-1校驗和”。

我有一個案例,我需要從2個來源中找到數百個JAR的版本作為Java應用程序的一部分。 首先,我打開JAR並首先在“ Implementation-Version”字段中檢查了JAR版本的Manifest.MF文件,如果沒有,則在“ Bundle-Version”字段中進行了檢查。 我用於此的代碼如下(顯然,您將需要更好的錯誤處理):

public String getVersionFromJarManifest(File jarFile){
    try {
        Manifest manifest = new JarFile(jarFile).getManifest();
        Attributes mainAttribs = manifest.getMainAttributes();
        String version = mainAttribs.getValue("Implementation-Version");

        if(version == null || version == "" || version.isEmpty()){
            version = mainAttribs.getValue("Bundle-Version");
        }

        return version;
    } catch (Exception e) {
        LOGGER.warn("Manifest not found for {}", jarFile.getPath());
        return null;
    }
}

如果無法從清單文件中獲取版本,則我計算了JAR的SHA-1校驗和,並在Maven中進行了搜索。 該代碼(再次不是很大的錯誤檢查)如下:

public String getVersionFromMavenByChecksum(File jarFile){
    String sha = null;
    try {
        MessageDigest md = MessageDigest.getInstance("SHA1");
        FileInputStream fis = new FileInputStream(jarFile);
        byte[] dataBytes = new byte[1024];

        int nread = 0;

        while ((nread = fis.read(dataBytes)) != -1) {
            md.update(dataBytes, 0, nread);
        }

        byte[] mdbytes = md.digest();

        //convert the byte to hex format
        StringBuffer sb = new StringBuffer("");
        for (int i = 0; i < mdbytes.length; i++) {
            sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
        }

        sha = sb.toString();
    } catch (Exception e) {
        LOGGER.warn("ERROR processing SHA-1 value for {}", jarFile.getPath());
        return null;
    }

    return getVersionBySha(sha);
}

public String getVersionBySha(String sha){
    String version = null;

    CloseableHttpClient httpClient = HttpClients.createDefault();

    List<NameValuePair> suQueryParams = new ArrayList<>();
    suQueryParams.add(new BasicNameValuePair("q", "1: \"" + sha + "\""));

    String result = null;

    try {
        result = MavenApiUtil.apiGETCall("http://search.maven.org/solrsearch/select", suQueryParams, null, httpClient);
    } catch (Exception e){
        LOGGER.warn("ERROR querying Maven for version for SHA {}", sha);
        return null;
    }

    //Parse response

    return version;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM