在Java servlet中读取自己的MANIFEST.MF文件

5

我正在尝试在Java servlet中读取自己的MANIFEST.MF资源。我的情况是:我有一个WAR文件(其中包含我想要读取的清单),它位于EAR文件内部。 EAR文件中有其他几个WAR和JAR文件,类路径非常长。

我尝试了在Web上找到的几种方法,包括StackOverflow。

我可以使用以下方式读取所有MANIFEST.MF文件:

this.getClass().getClassLoader().getResources("META-INF/MANIFEST.MF");

我需要遍历它们,但是我不知道哪一个是我的 - 我甚至不知道 Implementation-Title 是什么,因为这是由构建管道生成的。(我可以根据构建管道的知识猜测,因此我知道正确的清单在那里。但是,在生产代码中我不能猜测。)

当然,

this.getClass().getClassLoader().getResourceAsStream("META-INF/MANIFEST.MF");

从类路径上返回来自其他jar包的完全错误清单。

我也尝试过

this.getServletContext().getResourceAsStream("META-INF/MANIFEST.MF");

但它返回了一个空值。

如何访问包含当前运行的servlet的WAR文件的MANIFEST.MF文件?


3
你计划读取哪些清单属性?其中许多属性可以使用现有的Java SE方法获得。 - VGR
1
VGR +1,获取版本号示例:String version = getClass().getPackage().getImplementationVersion(); - Rustam
1
以上评论不适用于WAR自己的清单,因此是错误的。 - BalusC
@BalusC 您是正确的。我忽略了他想要.war文件的清单。标题可能需要编辑以澄清这一点。 - VGR
Servlets的定义是在WAR中运行。此外,它已经被标记了。 - BalusC
1
当然可以。但是在WEB-INF/classes和每个WEB-INF/lib下的.jar中都可能有一个清单。 - VGR
1个回答

5

I also tried

this.getServletContext().getResourceAsStream("META-INF/MANIFEST.MF");

but it returns a null.

为了表示绝对的WAR资源路径,该路径必须以/开头。

this.getServletContext().getResourceAsStream("/META-INF/MANIFEST.MF");

使用 ClassLoader#getResourceXxx() 是没有意义的,因为 WAR 自己的清单文件不在类路径中。它位于 Web 根目录下,与 /WEB-INF 并列。因此,ServletContext#getResourceXxx() 是唯一的方法。


这真是有帮助。我只是不明白,通过this.getClass().getClassLoader().getResources("META-INF/MANIFEST.MF")读取所有清单文件为什么也没有失败。 - user1608790
1
不客气。这些来自类路径而不是Web内容。其他规则也适用。另请参见https://dev59.com/Z3I95IYBdhLWcg3wxA8-等。 - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接