You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:02:28