我想阅读MANIFEST.MF
申请的WAR
。我怎样才能找到它的文件名?
答案 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无法访问您的情况,请检查这些情况。
答案 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类来读取清单的内容。
解决方案的要点有两个: