繁体   English   中英

如何从具有多个模块的项目中获取正确的清单? [JAVA]

[英]How to get the right manifest from project with multiple modules? [JAVA]

我想从Jar文件的清单中读取信息,以从那里获取SVNVersion信息,并将其显示在UI中。 我在一个多模块项目中工作,该项目包括一个客户端,在tomcat上运行的服务器,客户端的一些模块及其依赖项。

我编写了代码以访问当前线程的清单并获取其属性。

Manifest mf = new Manifest();

    mf.read(Thread.currentThread().getContextClassLoader().getResourceAsStream("META-INF/MANIFEST.MF"));

    Attributes atts = mf.getMainAttributes();
    System.out.println(atts.values());
    System.out.println("Version: " + atts.getClass());
    System.out.println("Revision: " + atts.get("SCM-Revision"));
    String scm = (String) atts.get("SCM-Revision");
    String revision = (String) atts.get("Revision-Number");
    return revision + scm;
}

唯一的事情是它获取返回的Null值,因为它是本地存储库中依赖项的清单,该依赖项中没有我需要的信息。

我的问题有解决方案吗? 从项目中指定模块的方式,使其知道要获取IT jar的清单,而不是依赖项中的模块? 谢谢!

(我删除了先前的答案,因为它有错误且不准确)

这是我以前必须从类路径中的任何类中获取正确清单的过程:它包括通过特定URL进行获取:

private static URL getManifestUrlForClass(Class<?> cl)
    throws MalformedURLException
{
    URL url=cl.getResource(cl.getSimpleName() + ".class");
    String s=url.toString();
    return new URL(s.substring(0, s.length() - (cl.getName() + ".class").length()) + "META-INF/MANIFEST.MF");

要从您的代码中使用它,只需替换第一行:

mf.read(getManifestUrlForClass(MyClass.class).openStream());

您会得到一个null因为默认情况下Maven禁用了清单,并且您得到的是来自Jdk(包含Thread-classfile的jar)中的值。 你要么读

this.getClass().getResourceAsStream("/META-INF/.../pom.properties")

或添加创建清单的功能(取决于模块包装,您必须为此选择正确的构建插件)。

警告: "/META-INF/.../pom.properties"在不同的Jar中可能具有相同的路径。 首先选择“类”以确定要阅读的pom.properties

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM