如何在WAR应用程序中读取MANIFEST.MF文件?

17
我想阅读我的WAR应用程序的MANIFEST.MF文件。我该如何找到它的文件名?

如何读取Web应用程序的清单文件?(参考链接:https://dev59.com/G3RB5IYBdhLWcg3wc3E0) - dma_k
4个回答

35

我怎么找到它的文件名?

你已经有了它。也许你想找到绝对文件位置?你可以使用ServletContext#getRealPath()

String relativeWARPath = "/META-INF/MANIFEST.MF";
String absoluteDiskPath = getServletContext().getRealPath(relativeWARPath);
File file = new File(absoluteDiskPath);
// ...

或者,如果您想直接将其作为InputStream获取,请使用ServletContext#getResourceAsStream()

InputStream input = getServletContext().getResourceAsStream("/META-INF/MANIFEST.MF");
// ...

谢谢,这就是我要找的。现在我需要找出如何在不是servlet本身的类中获取ServletContext。看起来我需要在web.xml中注册我的自定义ServletContextListener。对吗? - yegor256
只需将其作为构造函数或方法参数传递即可。 - BalusC
ServletContextListener 怎么样?我走对了吗? - yegor256
1
@Jack:你是第一名,不应该在EAR / EJB中访问WAR特定的工件。 在WAR端完成它。 另请参阅https://dev59.com/fXA75IYBdhLWcg3wH1JB ,以获取“@WebListener”示例。 - BalusC
2
结合 java.util.jar.Manifest 进行适当的解析。 - YoYo
显示剩余4条评论

11

它只会在WEB-INF文件夹中提供所有清单。 - qwerty

1
我做了一些研究以找到适合我的正确解决方案。 主要感谢BalusC,也感谢其他我现在无法记起的人,因为我深入研究了许多来源。 我有一个运行在Weblogic 12c(12.2.1.4)版本上的Web应用程序。 首先我必须告诉Maven在MANIFEST.MF中添加信息,在POM文件的插件部分中添加以下内容。
 <plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.2</version>
    <configuration>
      <archive>
        <manifest> 
         <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
          <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
        </manifest>
      </archive>
    </configuration>
  </plugin>

你可以在打包目标的控制台中找到Maven插件的版本。
然后我主要按照BalusC在帖子使用特殊的自动启动servlet在启动时初始化并共享应用程序数据中的指示进行操作。
contextInitialized方法中注册类之前,请注意。
 @Override public void contextInitialized(ServletContextEvent servletContextEvent)

我已将我的业务逻辑放置在从清单中检索信息的代码中,如下所示。
    @Override public void contextInitialized(ServletContextEvent servletContextEvent) {
        logger.info("context initialized - reading MANIFEST.MF infos");
        StringBuilder welcomeStrBuild;
        welcomeStrBuild = new StringBuilder("version");
        try (InputStream inputStream = servletContextEvent.getServletContext().getResourceAsStream("/META-INF/MANIFEST.MF")) {
            Properties prop = new Properties();
            prop.load(inputStream);
            welcomeStrBuild.append(prop.getProperty("Implementation-Version", "n/a"));
        } catch (Exception e) {
            logger.info("Unable to extract info from MANIFEST.MF");
            welcomeStrBuild.append("Unable to extract info from MANIFEST.MF");
        }
        infoProject = welcomeStrBuild.toString();
        servletContextEvent.getServletContext().setAttribute("config", this);
}

您当然可以使用Java Manifest类来读取清单内容,而不是使用Properties类。
解决方案的主要要点有两个:
  • 使用Maven war目标将信息添加到清单中
  • 在正确的时刻和正确的WAR文件中读取信息,因为如果您没有使用正确的方法,最终会从类加载器或其他JAR文件中读取清单。

0

有几种方法可以做到这一点,而所选择的答案仅适用于您想要在Servlet/SpringMVC层或任何您可以访问ServletContext的层上读取Manifiest文件的情况。

但是,如果您想要在Servlet启动之前甚至在logback配置或其他某些情况下读取像"version"这样的值,您可能需要进行一些旧式类加载或Manifest文件操作。

我发现了这个Github库(不是我的),其中包括4种不同的方式从Manifest文件中读取信息。如果您的情况无法访问ServletContext,请查看这些内容。

https://github.com/khmarbaise/version-examples


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