저는 현재 J2ME 폴리쉬 애플리케이션을 개발 중입니다. jar 파일의 정확한 버전을 얻는 데 어려움이 있습니다. 클래스에서 수행 된 가져 오기에 대한 jar 파일의 버전을 찾는 방법이 있습니까? 제 말은 뭔가 있으면 import xyz; jar xy 패키지의 버전을 알 수 있습니까?
답변:
JAR 파일의 압축을 풀고 매니페스트 파일 ( META-INF\MANIFEST.MF
)을 찾습니다 . JAR 파일의 매니페스트 파일에는 버전 번호가 포함될 수 있습니다 (항상 버전이 지정되지는 않음).
sqljdbc42.jar
Cognos에서 사용한 다양한 파일에 기록 된 버전 이 없지만 Cognos는 버전 (4.2.6420.100)을보고 할 수 있습니다. 이 버전이 매니페스트에 기록되지 않은 경우 어디에서 가져 오나요?
각 jar 버전에는 고유 한 체크섬이 있습니다. 버전 정보가없는 jar의 체크섬을 계산하고 다른 버전의 jar와 비교할 수 있습니다. 체크섬을 사용하여 항아리를 검색 할 수도 있습니다.
체크섬을 계산하려면이 질문을 참조하십시오 . 내 컴퓨터에있는 파일의 체크섬을 계산하는 가장 좋은 방법은 무엇입니까?
기본적으로 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
이 간단한 프로그램은 즉, 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를 사용합니다 .
늦었지만 다음 두 가지 방법을 시도해 볼 수 있습니다
이 필요한 수업 사용
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 세부 정보가 필요할 때 잘 작동합니다. 도움이 되었기를 바랍니다.
다음을 사용하여 MANIFEST 파일에서 버전을 필터링 할 수 있습니다.
unzip -p my.jar META-INF/MANIFEST.MF | grep 'Bundle-Version'
Bundle-Version
.
이 질문이 여전히 검색에서 꽤 많이 나오기 때문에 더 최근의 답변을 줄 것이라고 생각했습니다.
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