<分区>
我有一个项目使用旧的 Cassandra 驱动程序库,它依赖于 Guava 的已弃用功能,这些功能已在版本 20 中删除。我正在考虑添加一个测试,当有人不小心将 Guava 的版本从 19 增加到20.
如何以编程方式找出使用的 Guava 版本?
<分区>
我有一个项目使用旧的 Cassandra 驱动程序库,它依赖于 Guava 的已弃用功能,这些功能已在版本 20 中删除。我正在考虑添加一个测试,当有人不小心将 Guava 的版本从 19 增加到20.
如何以编程方式找出使用的 Guava 版本?
最佳答案
您可以从 guava.jar 中的 META-INF/下的文件中获取版本字符串。在运行时,您需要使用适当的 ClassLoader
实例来加载您想要的 META-INF/文件。您可以使用 Guava 的 Resources
实用程序类直接加载具有唯一名称的资源,或者您可以使用 $someGuavaClassName.class.getClassLoader().getResources(String)< 遍历多个
。如果您选择后者,那么您将需要使用将存在于您正在测试的版本中的 jar
文件中具有相同名称的资源someGuavaClassName
。 Resources
本身从 1.0 开始就在 Guava 中,我不怀疑它很快就会出现在任何地方,所以它应该是一个可以安全使用的类。
我在 Guava 20.0 和 12.0 上测试了以下内容,它对两者都有效。我怀疑它适用于所有相对较新版本的 Guava:
public class GuavaVersionFetcher {
public static void main(String... args) throws IOException {
System.out.println(determineGuavaMavenVersion());
System.out.println(determineGuavaManifestVersion());
}
public static String determineGuavaMavenVersion() throws IOException {
String resourceName = "META-INF/maven/com.google.guava/guava/pom.properties";
Properties properties = new Properties();
try (InputStream inputStream = Resources.getResource(resourceName).openStream()) {
properties.load(inputStream);
}
return properties.getProperty("version");
}
public static String determineGuavaManifestVersion() throws IOException {
Enumeration<URL> resources = Resources.class.getClassLoader()
.getResources("META-INF/MANIFEST.MF");
while (resources.hasMoreElements()) {
Manifest manifest;
try (InputStream inputStream = resources.nextElement().openStream()) {
manifest = new Manifest(inputStream);
}
Attributes mainAttributes = manifest.getMainAttributes();
String symbolicName = mainAttributes.getValue("Bundle-SymbolicName");
if ("com.google.guava".equals(symbolicName)) {
return mainAttributes.getValue("Bundle-Version");
}
}
return null;
}
}
示例输出:
20.0
20.0.0
注意:如果 Guava 团队不再使用 Maven,第一种方法可能不再有效,所以我建议使用 manifest 方法。
关于java - 检测使用的是哪个 Guava 版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40893964/