如何从具有多个模块的项目中获取正确的清单? [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 清单而不是依赖项中的清单?
谢谢!
你得到一个 null
因为清单在默认情况下在 maven 中是禁用的,你得到的是来自 Jdk (包含线程类文件的 jar)的值。你要么阅读
this.getClass().getResourceAsStream("/META-INF/.../pom.properties")
或添加创建清单的功能(取决于模块包装,您必须为此选择正确的构建插件)。
警告:"/META-INF/.../pom.properties"
可能在不同的 Jar 中有 相同的 路径。首先选择 Class 以确定 pom.properties
您喜欢阅读的内容。
(我删除了我之前的回答,因为它有错误且不准确)
这是我过去必须从 class 路径中的任何 class 获取正确清单的过程:它包括通过特定的 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());
我想从我的 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 清单而不是依赖项中的清单? 谢谢!
你得到一个 null
因为清单在默认情况下在 maven 中是禁用的,你得到的是来自 Jdk (包含线程类文件的 jar)的值。你要么阅读
this.getClass().getResourceAsStream("/META-INF/.../pom.properties")
或添加创建清单的功能(取决于模块包装,您必须为此选择正确的构建插件)。
警告:"/META-INF/.../pom.properties"
可能在不同的 Jar 中有 相同的 路径。首先选择 Class 以确定 pom.properties
您喜欢阅读的内容。
(我删除了我之前的回答,因为它有错误且不准确)
这是我过去必须从 class 路径中的任何 class 获取正确清单的过程:它包括通过特定的 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());