Glassfish下JAX-RS初始化时读取WAR包MANIFEST.MF的问题
解决Glassfish中JAX-RS读取WAR包内MANIFEST.MF的问题
我太懂这个坑了——你用getClasses().getClass().getResourceAsStream("/META-INF/MANIFEST.MF")读到的根本不是自己WAR包里的MANIFEST,而是Glassfish容器本身的!这是类加载器的层级问题:系统类加载器会优先加载容器的资源,轮不到你的应用资源。
要搞定这个,得用ServletContext来直接访问你的WAR包资源,毕竟它是和当前应用绑定的。在JAX-RS里,你可以通过@Context注解轻松注入它,然后用它来读取正确的MANIFEST文件。
给你写个完整的示例代码,对应你的包路径com.remal.forum.service.configuration.rest:
package com.remal.forum.service.configuration.rest; import javax.servlet.ServletContext; import javax.ws.rs.core.Context; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class RestConfiguration { @Context private ServletContext servletContext; public String getApplicationVersion() throws IOException { Properties manifestProps = new Properties(); // 关键:用ServletContext获取WAR内的MANIFEST.MF try (InputStream is = servletContext.getResourceAsStream("/META-INF/MANIFEST.MF")) { if (is != null) { manifestProps.load(is); return manifestProps.getProperty("Implementation-Version"); } } // 如果没找到就返回默认值 return "unknown"; } }
这里几个关键点要注意:
@Context ServletContext:JAX-RS会自动把当前应用的Servlet上下文注入进来,它直接指向你的WAR包资源根目录servletContext.getResourceAsStream():这个方法是从你的应用内部读取资源,完全不会拿到容器的文件- 用try-with-resources语法:确保输入流自动关闭,避免资源泄漏,这是个好习惯
另外还要确认下你的WAR包确实在META-INF目录下有MANIFEST.MF,并且已经正确设置了Implementation-Version属性哦。如果是在JAX-RS的Application子类里做初始化,同样可以用@Context注入ServletContext来实现这个逻辑。
内容的提问来源于stack exchange,提问作者zappee
相关产品推荐
相关产品推荐

