jar 파일의 버전을 확인하는 방법은 무엇입니까?


91

저는 현재 J2ME 폴리쉬 애플리케이션을 개발 중입니다. jar 파일의 정확한 버전을 얻는 데 어려움이 있습니다. 클래스에서 수행 된 가져 오기에 대한 jar 파일의 버전을 찾는 방법이 있습니까? 제 말은 뭔가 있으면 import xyz; jar xy 패키지의 버전을 알 수 있습니까?

답변:


79

JAR 파일의 압축을 풀고 매니페스트 파일 ( META-INF\MANIFEST.MF)을 찾습니다 . JAR 파일의 매니페스트 파일에는 버전 번호가 포함될 수 있습니다 (항상 버전이 지정되지는 않음).


응용 프로그램을 향상시키기 위해 노력하고 있다고 말했듯이 jar 파일을 다운로드했으며 jar 파일의 버전을 알고 있습니다. 그러나 패키지가 속한 항아리의 버전을 알고 싶었습니다.
Ritesh Mengji 2011

더 설명하기 위해 xyz를 가져 왔습니다. xy가 a-4.1.jar에 속한다는 것을 알고 있지만 작업중인 응용 프로그램은 오래 전에 개발되었으며 어떤 버전의 a.jar 파일을 사용했는지 알 수 없습니다. 일부 클래스가 이전 버전의 항아리에서 감가 상각 되었기 때문에 버전이 걱정됩니다. 라이브러리에 항아리가 있어도 가져 오기를 해결할 수 없음을 알기 때문입니다.
Ritesh Mengji

응용 프로그램을 빌드하는 동안 사용한 jar의 버전을 알고 있다면 동일한 버전의 jar를 사용하여 응용 프로그램을 실행할 수도 있습니까?
Vivek 2011

1
이것이 귀하의 요구 사항이라면 더 이상 사용되지 않는 jar를 제외하고 응용 프로그램을 다시 빌드해야 할 것입니다. 주어진 jar와 관련된 버전 번호를 찾는 것은 일대일 기능과 같기 때문입니다. 하나의 jar 파일에 대해 하나의 버전 번호 만 있습니다. 그러나 개발자가 필요한 jar를 응용 프로그램에 첨부하지 않는 한 응용 프로그램 개발 당시 어떤 버전의 jar가 사용되었는지 찾는 것은 매우 불가능한 것처럼 들립니다.
Vivek 2011

1
MANIFEST.MF의 녹음 버전은 선택 사항 인 것으로 보입니다. sqljdbc42.jarCognos에서 사용한 다양한 파일에 기록 된 버전 이 없지만 Cognos는 버전 (4.2.6420.100)을보고 할 수 있습니다. 이 버전이 매니페스트에 기록되지 않은 경우 어디에서 가져 오나요?
Nick.McDermaid

53

압축을 풀고 META-INF/MANIFEST.MF파일을 확인해야 합니다. 예 :

unzip -p file.jar | head

또는 더 구체적 :

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

27

위의 답변을 확장하기 위해 JAR의 META-INF / MANIFEST.MF 파일 안에 다음 줄이 표시 될 것입니다. Manifest-Version: 1.0 ← 이것은 jar 버전 번호 가 아닙니다 !

당신을 위해 볼 필요가 Implementation-Version존재, 당신은 거기에 확인할 수있는 것들에로 JAR의 저자에게 이렇게 전적으로 자유 텍스트 문자열 인 경우. Oracle 문서패키지 버전 사양 도 참조하십시오.


이 답변 (및 기타) 현재 메타 논의
토마스 웰러

17

위의 답변을 완료하기 위해.

매니페스트 파일은 jar의 META-INF\MANIFEST.MFpath에 있습니다.

zip을 지원하는 모든 아카이버에서 jar의 내용을 검사 할 수 있습니다.


2
이 답변 (및 기타) 현재 메타 논의
토마스 웰러

11

각 jar 버전에는 고유 한 체크섬이 있습니다. 버전 정보가없는 jar의 체크섬을 계산하고 다른 버전의 jar와 비교할 수 있습니다. 체크섬을 사용하여 항아리를 검색 할 수도 있습니다.

체크섬을 계산하려면이 질문을 참조하십시오 . 내 컴퓨터에있는 파일의 체크섬을 계산하는 가장 좋은 방법은 무엇입니까?


5
방금 jar md5를 계산하여 Google에 붙여 넣었습니다. 정말 잘 했어요, 정말 고마워요!
mik01aj 2014

7

기본적으로 java.lang.Package클래스에 대한 정보를 제공하기 위해 클래스 로더를 사용하는 클래스를 사용해야합니다.

예:

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

로그 백은이 기능을 사용하여 생성 된 스택 트레이스에서 각 클래스의 JAR 이름 / 버전을 추적하는 것으로 알려져 있습니다.

또한 참조 http://docs.oracle.com/javase/8/docs/technotes/guides/versioning/spec/versioning2.html#wp90779


3

이 간단한 프로그램은 즉, jar 버전의 모든 경우를 나열합니다.

  • 매니페스트 파일에서 찾은 버전
  • Manifest 및 jar 이름에서도 버전을 찾을 수 없습니다.
  • 매니페스트 파일을 찾을 수 없습니다.

    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);
    

http://www.javaxt.com/downloads/ 에서 다운로드 할 수있는 javaxt-core jar를 사용합니다 .


javaxt에 대한 참조 주셔서 감사합니다, 난 그냥에서이 간단한 코드 예제를 사용 javaxt.com/Tutorials/Jar/...
데이비드

1
참고로 maven이 JAR을 다운로드하는 대신 javaxt-core를 가져 오는 것을 선호하는 사람들을 위해 다음 방법 중 하나를 수행 할 수 있습니다. gist.github.com/daluu/dda7b29cb5b6e0fbfbaec664eb759739 , gist.github.com/daluu/52af7eef52563ddf78fe
David

2

늦었지만 다음 두 가지 방법을 시도해 볼 수 있습니다

이 필요한 수업 사용

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

이 메소드를 사용하면 jar 속성에 액세스 할 수 있습니다. 나는 이전 버전과 호환되는 것을 좋아하고 최신 버전을 사용합니다. 그래서 이것을 사용했습니다

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;
}

이것은 maven을 사용하고 알려진 클래스에 대한 pom 세부 정보가 필요할 때 잘 작동합니다. 도움이 되었기를 바랍니다.


1

Linux의 경우 다음을 시도하십시오.

찾기 . -name "YOUR_JAR_FILE.jar"-exec zipgrep "구현 버전 :" '{}'\; | awk -F ':' '{print $ 2}'


1

winrar가있는 경우 winrar로 jar를 열고 두 번 클릭하여 폴더를 엽니 다 META-INF. 추출 MANIFEST.MFCHANGES모든 위치 (예 : 데스크톱)에 파일을 파일을 합니다.

텍스트 편집기에서 추출 된 파일을 엽니 다. 구현 버전 또는 릴리스 버전이 표시됩니다.


0

다음을 사용하여 MANIFEST 파일에서 버전을 필터링 할 수 있습니다.

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


이것은 대부분이 오래된 답변을 복제하는 것 같습니다 -stackoverflow.com/a/38313502/272387- , 매니페스트는 보장되지 않습니다 Bundle-Version.
Richlv

0

이 질문이 여전히 검색에서 꽤 많이 나오기 때문에 더 최근의 답변을 줄 것이라고 생각했습니다.

CLi JAR 버전 확인 :

CLi jar 파일에서 다음을 실행합니다.

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

출력 예 :

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

CLi 버전은 위에 나열되어 있습니다.

서버 버전을 얻으려면 다음을 실행하십시오.

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

(위는 인증 구현에 따라 달라 지므로 적절하게 변경하십시오)

출력 예 :

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.