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

时间:2010-11-21 18:05:45

标签: java servlets

我想阅读MANIFEST.MF申请的WAR。我怎样才能找到它的文件名?

4 个答案:

答案 0 :(得分:32)

  

如何找到文件名?

你已经拥有它。也许你想找到绝对的文件位置?您可以使用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");
// ...

答案 1 :(得分:10)

我在每个应用程序中遇到同样的问题,并决定在其中创建一个带有实用程序类的组件:jcabi-manifests。现在,可以轻松地从类路径中的可用MANIFEST.MF加载任何属性:

import com.jcabi.manifests.Manifests;
String value = Manifests.read("My-Version");

另外,请检查一下:http://www.yegor256.com/2014/07/03/how-to-read-manifest-mf.html

答案 2 :(得分:0)

有几种方法可以做到这一点,只有当您想要读取Servlet / SpringMVC层上的Manifiest文件或您可以访问ServletContext的任何层时,所选答案才有效。

但是,如果你想读取类似"版本"的值。甚至在Servlet启动之前,比如在回溯配置或其他情况下,您可能需要执行一些旧的类加载或Manifest文件操作。

我找到了这个github存储库(不是我的),它包含4种不同的方式从Manifest文件中读取信息。如果ServletContext无法访问您的情况,请检查这些情况。

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

答案 3 :(得分:0)

我做了一些研究,以找到适合我的解决方案。 主要感谢BalusC,也感谢我现在不记得的其他人,因为我深入研究了许多资料。 我有一个在Weblogic 12c(12.2.1.4)版本上运行的Web应用程序。 首先,我不得不说要在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插件的版本。

然后我主要按照帖子Using special auto start servlet to initialize on startup and share application data

中的BalusC方向进行操作。

在通过 contextInitialized 方法在servlet上下文中注册该类之前

 @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中读取信息,因为如果使用的方法不正确,则最终从类加载器或其他jar中读取清单