场景
程序运行过程中,由于依赖传递导致类所在Jar包版本不正确时可使用。
代码一(spring-core)
获取Jar包里MANIFEST.MF中定义的Implementation-Version属性
package org.springframework.core;
/**
* Fetches the "Implementation-Version" manifest attribute from the jar file.
*
* @author Juergen Hoeller
* @since 1.1
*/
public final class SpringVersion {
private SpringVersion() {
}
@Nullable
public static String getVersion() {
Package pkg = SpringVersion.class.getPackage();
return (pkg != null ? pkg.getImplementationVersion() : null);
}
}
Package类中VersionInfo类还包含其他信息
代码二(mybatisplus-core)
优先从Package中提取,提取不到再从CodeSource -> JarFile中提取
package com.baomidou.mybatisplus.core;
public class MybatisPlusVersion {
public static String getVersion() {
final Package pkg = MybatisPlusVersion.class.getPackage();
if (pkg != null && pkg.getImplementationVersion() != null) {
return pkg.getImplementationVersion();
}
CodeSource codeSource = MybatisPlusVersion.class.getProtectionDomain().getCodeSource();
if (codeSource == null) {
return null;
}
URL codeSourceLocation = codeSource.getLocation();
try {
URLConnection connection = codeSourceLocation.openConnection();
if (connection instanceof JarURLConnection) {
return getImplementationVersion(((JarURLConnection) connection).getJarFile());
}
try (JarFile jarFile = new JarFile(new File(codeSourceLocation.toURI()))) {
return getImplementationVersion(jarFile);
}
} catch (Exception ex) {
return null;
}
}
private static String getImplementationVersion(JarFile jarFile) throws IOException {
return jarFile.getManifest().getMainAttributes().getValue(Attributes.Name.IMPLEMENTATION_VERSION);
}
}