检测使用哪种Guava版本?

时间:2016-11-30 16:55:33

标签: java guava

我有一个使用旧Cassandra驱动程序库的项目,它依赖于已在第20版中删除的Guava的弃用功能。我正在考虑添加一个测试,当有人意外地将Guava的版本从19增加到20。

如何以编程方式找出使用的Guava版本?

2 个答案:

答案 0 :(得分:5)

您可以从guava.jar中的META-INF /下的文件中获取版本字符串。在运行时,您需要使用适当的ClassLoader实例才能加载所需的META-INF /文件。您可以使用Guava的Resources实用程序类直接加载具有唯一名称的资源,也可以使用jar在多个$someGuavaClassName.class.getClassLoader().getResources(String)文件中迭代使用相同名称的资源。如果您使用后者,那么您将需要使用您正在测试的版本中存在的someGuavaClassNameResources本身自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方法。

答案 1 :(得分:1)

我没有找到一种简单的方法来访问该版本,但这里有一个适合我的解决方案:

Graph

这个测试将传递给Guava 19,并且会在Guava 20中失败。JFrame类只是我在发行说明中找到的第一个添加的类。