在运行时从没有java类的包中获取Maven工件版本

时间:2017-07-21 09:22:07

标签: java maven

相关:Get Maven artifact version at runtime

对比链接问题,它依赖于包中类的getPackage() - 方法,对于不包含java类的包,如何实现相同的结果,但只是一个支持库网络资源?

1 个答案:

答案 0 :(得分:0)

使用第二个答案中的方法: reading MANIFEST.MF file from jar file using JAVA 并在Attributes中添加条件 - 检查MANIFEST.MF中显示的标题返回正确的版本。

public static String getManifestInfo() {
        Enumeration resEnum;
        try {
            resEnum = Thread.currentThread().getContextClassLoader().getResources(JarFile.MANIFEST_NAME);
            while (resEnum.hasMoreElements()) {
                try {
                    URL url = (URL)resEnum.nextElement();
                    InputStream is = url.openStream();
                    if (is != null ) {
                        Manifest manifest = new Manifest(is);
                        Attributes mainAttribs = manifest.getMainAttributes();
                        String version = mainAttribs.getValue("Implementation-Version");
                        String name = mainAttribs.getValue("Implementation-Title");
                        if (version != null && name != null) {
                            if ("packagetitle".equals(name))
                                return version;
                        }
                    }
                }
                catch (Exception e) {
                    // Silently ignore wrong manifests on classpath?
                }
            }
        } catch (IOException e1) {
            // Silently ignore wrong manifests on classpath?
        }
        return null;
    }

如果知道有关包本身的详细信息,可以通过使用stream()跳过迭代来确保更有效,但至少这可以按预期工作。