[英]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.