làm thế nào để kiểm tra phiên bản của tệp jar?


91

Tôi hiện đang làm việc trên một ứng dụng đánh bóng J2ME, chỉ cần nâng cao nó. Tôi đang gặp khó khăn để tải phiên bản chính xác của tệp jar. Có cách nào để tìm phiên bản của tệp jar cho các lần nhập được thực hiện trong lớp không? Ý tôi là nếu bạn có một số thứ, hãy nhập xyz; chúng ta có thể biết phiên bản của gói jar xy thuộc về?

Câu trả lời:


78

Giải nén tệp JAR và tìm tệp kê khai ( META-INF\MANIFEST.MF). Tệp kê khai của tệp JAR có thể chứa số phiên bản (nhưng không phải lúc nào phiên bản cũng được chỉ định).


Như tôi đã nói rằng tôi đang làm việc để cải thiện ứng dụng, tôi đã tải xuống các tệp jar và tôi biết phiên bản của tệp jar. Nhưng tôi muốn biết phiên bản của lọ mà gói thuộc về, tôi hy vọng bạn hiểu được.
Ritesh Mengji

Để giải thích thêm cho bạn, tôi đã nhập xyz, tôi biết rằng xy thuộc về a-4.1.jar, nhưng ứng dụng mà tôi đang làm việc đã được phát triển từ lâu và tôi không biết họ đã sử dụng phiên bản nào của tệp a.jar, tôi lo lắng về phiên bản bởi vì, một số lớp đã bị mất giá so với jar của phiên bản cũ hơn (tôi cảm thấy vậy), bởi vì, mặc dù tôi có jar trong thư viện, tôi thấy việc nhập không thể được giải quyết
Ritesh Mengji

Vậy có phải là, nếu bạn biết phiên bản jar mà họ đã sử dụng trong khi xây dựng ứng dụng, bạn cũng sẽ sử dụng phiên bản jar tương tự để thực thi ứng dụng?
Vivek

1
Nếu đó là yêu cầu của bạn, thì e rằng bạn sẽ phải xây dựng lại ứng dụng với loại trừ các lọ không dùng nữa. Bởi vì việc tìm kiếm số phiên bản được liên kết với một jar nhất định giống như hàm 1-1. Chỉ một số phiên bản cho một tệp jar. Nhưng việc tìm kiếm phiên bản jar nào được sử dụng vào thời điểm phát triển ứng dụng nghe có vẻ không khả thi đối với tôi trừ khi nhà phát triển đính kèm các lọ bắt buộc với ứng dụng.
Vivek

1
Phiên bản ghi âm trong MANIFEST.MF dường như là tùy chọn. Không có phiên bản nào được ghi lại trong các sqljdbc42.jartệp khác nhau mà tôi đã sử dụng với Cognos, nhưng Cognos có thể báo cáo một phiên bản (4.2.6420.100). Nó lấy phiên bản này từ đâu nếu nó không được ghi trong tệp kê khai?
Nick.McDermaid

52

Bạn cần giải nén nó và kiểm tra META-INF/MANIFEST.MFtệp của nó , ví dụ:

unzip -p file.jar | head

hoặc cụ thể hơn:

unzip -p file.jar META-INF/MANIFEST.MF

26

Chỉ để mở rộng các câu trả lời ở trên, bên trong tệp META-INF / MANIFEST.MF trong JAR, bạn có thể sẽ thấy một dòng: Manifest-Version: 1.0 ← Đây KHÔNG phải là số phiên bản jar!

Bạn cần tìm Implementation-Version, nếu có, là một chuỗi văn bản tự do, do đó hoàn toàn phụ thuộc vào tác giả của JAR về những gì bạn sẽ tìm thấy trong đó. Xem thêm tài liệu Oraclephiên bản gói cụ thể


Câu trả lời này (và những người khác) hiện đang thảo luận trên Meta
Thomas Weller

17

Chỉ để hoàn thành câu trả lời trên.

Tệp kê khai nằm bên trong jar tại META-INF\MANIFEST.MFđường dẫn.

Bạn có thể kiểm tra nội dung của jar trong bất kỳ trình lưu trữ nào hỗ trợ zip.


2
Câu trả lời này (và những người khác) hiện đang thảo luận trên Meta
Thomas Weller

11

Mỗi phiên bản jar có một tổng kiểm tra duy nhất. Bạn có thể tính toán tổng kiểm tra cho jar của bạn (không có thông tin phiên bản) và so sánh nó với các phiên bản khác nhau của jar. Chúng tôi cũng có thể tìm kiếm một jar bằng cách sử dụng tổng kiểm tra.

Tham khảo Câu hỏi này để tính tổng tổng: Cách tốt nhất để tính tổng tổng cho một tệp trong máy của tôi là gì?


5
Mình vừa tính cái jar md5 và dán lên google. Làm việc rất tốt, cảm ơn rất nhiều!
mik01aj

7

Về cơ bản, bạn nên sử dụng java.lang.Packagelớp sử dụng trình nạp lớp để cung cấp cho bạn thông tin về các lớp của bạn.

thí dụ:

String.class.getPackage().getImplementationVersion();
Package.getPackage(this).getImplementationVersion();
Package.getPackage("java.lang.String").getImplementationVersion();

Tôi nghĩ rằng logback được biết là sử dụng tính năng này để theo dõi tên / phiên bản JAR của mỗi lớp trong các đường xếp chồng được tạo ra.

xem thêm http://docs.oracle.com/javase/8/docs/technotes/guides/vers ỨNG DỤNG/spec/versions2.html#wp90779


3

Chương trình đơn giản này sẽ liệt kê tất cả các trường hợp cho phiên bản jar cụ thể là

  • Phiên bản được tìm thấy trong tệp kê khai
  • Không tìm thấy phiên bản nào trong Tệp kê khai và thậm chí từ tên jar
  • Không tìm thấy tệp kê khai

    Map<String, String> jarsWithVersionFound   = new LinkedHashMap<String, String>();
    List<String> jarsWithNoManifest     = new LinkedList<String>();
    List<String> jarsWithNoVersionFound = new LinkedList<String>();
    
    //loop through the files in lib folder
    //pick a jar one by one and getVersion()
    //print in console..save to file(?)..maybe later
    
    File[] files = new File("path_to_jar_folder").listFiles();
    
    for(File file : files)
    {
        String fileName = file.getName();
    
    
        try
        {
            String jarVersion = new Jar(file).getVersion();
    
            if(jarVersion == null)
                jarsWithNoVersionFound.add(fileName);
            else
                jarsWithVersionFound.put(fileName, jarVersion);
    
        }
        catch(Exception ex)
        {
            jarsWithNoManifest.add(fileName);
        }
    }
    
    System.out.println("******* JARs with versions found *******");
    for(Entry<String, String> jarName : jarsWithVersionFound.entrySet())
        System.out.println(jarName.getKey() + " : " + jarName.getValue());
    
    System.out.println("\n \n ******* JARs with no versions found *******");
    for(String jarName : jarsWithNoVersionFound)
        System.out.println(jarName);
    
    System.out.println("\n \n ******* JARs with no manifest found *******");
    for(String jarName : jarsWithNoManifest)
        System.out.println(jarName);
    

Nó sử dụng javaxt-core jar có thể được tải xuống từ http://www.javaxt.com/downloads/


Cảm ơn bạn đã tham khảo javaxt, tôi vừa sử dụng mẫu mã đơn giản hơn ở đó từ javaxt.com/Tutorials/Jar/…
David

1
FYI, đối với những người thích maven kéo javaxt-core hơn là tải xuống JAR, bạn có thể thực hiện một trong các cách tiếp cận sau: gist.github.com/daluu/dda7b29cb5b6e0fbfbaec664eb759739 , gist.github.com/daluu/52af7eef52563ddf78fe
David

2

Tôi đến muộn nhưng bạn có thể thử hai phương pháp sau

sử dụng các lớp cần thiết này

import java.util.jar.Attributes;
import java.util.jar.Manifest;

Các phương thức này cho phép tôi truy cập các thuộc tính jar. Tôi thích tương thích ngược và sử dụng phiên bản mới nhất. Vì vậy, tôi đã sử dụng cái này

public Attributes detectClassBuildInfoAttributes(Class sourceClass) throws MalformedURLException, IOException {
    String className = sourceClass.getSimpleName() + ".class";
    String classPath = sourceClass.getResource(className).toString();
    if (!classPath.startsWith("jar")) {
      // Class not from JAR
      return null;
    }
    String manifestPath = classPath.substring(0, classPath.lastIndexOf("!") + 1) + 
        "/META-INF/MANIFEST.MF";
    Manifest manifest = new Manifest(new URL(manifestPath).openStream());
    return manifest.getEntries().get("Build-Info");
}

public String retrieveClassInfoAttribute(Class sourceClass, String attributeName) throws MalformedURLException, IOException {
    Attributes version_attr = detectClassBuildInfoAttributes(sourceClass);

    String attribute = version_attr.getValue(attributeName);

    return attribute;
}

Điều này hoạt động tốt khi bạn đang sử dụng maven và cần thông tin chi tiết về pom cho các lớp đã biết. Hi vọng điêu nay co ich.


1

Đối với Linux, hãy thử làm theo các bước sau:

tìm thấy . -name "YOUR_JAR_FILE.jar" -exec zipgrep "Triển khai-Phiên bản:" '{}' \; | awk -F ':' '{print $ 2}'


1

Nếu bạn có winrar, hãy mở jar bằng winrar, nhấp đúp để mở thư mục META-INF. Giải nén MANIFEST.MFCHANGEStập tin vào bất kỳ vị trí nào (giả sử máy tính để bàn).

Mở tệp đã trích xuất trong trình soạn thảo văn bản: Bạn sẽ thấy Phiên bản triển khai hoặc phiên bản phát hành.


0

Bạn có thể lọc phiên bản từ tệp MANIFEST bằng cách sử dụng

unzip -p my.jar META-INF/MANIFEST.MF | grep 'Bundle-Version'


Điều này hầu như trùng lặp với câu trả lời cũ hơn này - stackoverflow.com/a/38313502/272387 - và các tệp kê khai không được đảm bảo là có Bundle-Version.
Richlv

0

Tôi nghĩ rằng tôi sẽ đưa ra một câu trả lời gần đây hơn vì câu hỏi này vẫn xuất hiện khá cao trên các tìm kiếm.

Kiểm tra phiên bản CLi JAR:

Chạy phần sau trên tệp jar CLi:

unzip -p jenkins-cli.jar META-INF/MANIFEST.MF

Đầu ra mẫu:

Manifest-Version: 1.0
Built-By: kohsuke
Jenkins-CLI-Version: 2.210  <--- Jenkins CLI Version
Created-By: Apache Maven 3.6.1
Build-Jdk: 1.8.0_144
Main-Class: hudson.cli.CLI

Phiên bản CLi được liệt kê ở trên.

Để tải Phiên bản Máy chủ, hãy chạy như sau:

java -jar ./jenkins-cli.jar -s https://<Server_URL> -auth <email>@<domain>.com:<API Token> version

(ở trên sẽ thay đổi dựa trên việc triển khai xác thực của bạn, vui lòng thay đổi cho phù hợp)

Đầu ra mẫu:

Dec 23, 2019 4:42:55 PM org.apache.sshd.common.util.security.AbstractSecurityProviderRegistrar getOrCreateProvider
INFO: getOrCreateProvider(EdDSA) created instance of net.i2p.crypto.eddsa.EdDSASecurityProvider
2.210  <-- Jenkins Server Version

-14

Nó có thể được kiểm tra bằng một lệnh java -jar jarname


6
Điều này sẽ chạy main()phương pháp của JAR
Thomas Weller
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.