如何从具有多个模块的项目中获取正确的清单? [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());