如何从WebService请求中获取war包的MANIFEST.MF文件内容?
从WebService请求中访问MANIFEST.MF资源的解决方案
你之前用到的FacesContext相关方法依赖JSF请求上下文,WebService请求场景下不存在活跃的FacesContext实例,所以无法直接复用该逻辑,可通过以下两种方案实现需求:
方案1:基于ServletContext注入(RESTful服务场景推荐)
JAX-RS规范支持通过@Context注解注入ServletContext实例,可以直接读取Web应用根路径下的资源,返回结果和你之前的FacesContext方案完全一致:
import javax.ws.rs.core.Context; import javax.servlet.ServletContext; import java.io.InputStream; import java.util.jar.Manifest; public class YourRestService { // 注入ServletContext实例 @Context private ServletContext servletContext; public void getManifestInfo() { InputStream is = servletContext.getResourceAsStream("/META-INF/MANIFEST.MF"); Manifest manifest = new Manifest(is); // 后续解析逻辑和原有逻辑一致 } }
方案2:基于类加载器读取(无容器依赖通用方案)
如果不想依赖Web容器上下文,可以直接通过类加载器读取类路径下的MANIFEST文件,适用于所有Java运行场景:
// 方式1:用当前类的类加载器读取 InputStream is = getClass().getClassLoader().getResourceAsStream("META-INF/MANIFEST.MF"); // 方式2:用线程上下文类加载器读取,适配复杂类加载器层级场景 InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("META-INF/MANIFEST.MF");
注意事项
- 如果应用中存在多个Jar包都携带MANIFEST.MF文件,类加载器会返回加载顺序优先级最高的文件,如果你需要明确读取当前Web应用自身的MANIFEST.MF,优先选择方案1
- 拿到输入流后的解析逻辑和原有逻辑完全一致,可直接使用
java.util.jar.Manifest类读取对应属性:
Attributes attrs = manifest.getMainAttributes(); // 读取构建版本、规范标题等自定义属性 String buildVersion = attrs.getValue("Implementation-Version"); String specTitle = attrs.getValue("Specification-Title");
内容的提问来源于stack exchange,提问作者Sudhik
相关产品推荐
相关产品推荐

