获取Struts2中的MANIFEST.MF路径

获取Struts2中的MANIFEST.MF路径,struts2,Struts2,我想从我的web应用程序中读取MANIFEST.MF(我以前用附加属性填充了它)。在JSF中,我可以使用FacesContext轻松检索该路径值。如何使用静态调用实现Struts2的相同功能 File manifestFile = null; //JSF Context String homePath = "EMPTY"; //homePath = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/"); /

我想从我的web应用程序中读取MANIFEST.MF(我以前用附加属性填充了它)。在JSF中,我可以使用FacesContext轻松检索该路径值。如何使用静态调用实现Struts2的相同功能

File manifestFile = null;
//JSF Context
String homePath = "EMPTY";
//homePath = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/");
// HOW DO I RETRIEVE THE homePath VALUE OF THE WAR FILE?
java.util.jar.Manifest manifest = null;
manifestFile = new File(homePath, "META-INF/MANIFEST.MF");
来自JSP Struts2页面的静态调用可以工作,但不会返回任何值,当然,因为
manifestFile
为空

<s:property value='@ch.ejpd.admin.ManifestReader@getAppVersion()'/>

如果您了解
web应用程序中的
javax.servlet.ServletContext
是什么,您可以通过实现
ServletContextAware
接口在action类中获得它。此接口即
javax.servlet.ServletContext
提供了类似
getContextPath()
getRealPath(字符串路径)
getResource(字符串路径)
getResourceAsStream(字符串路径)
等API。此API可以帮助您获得所需的内容。尝试阅读此API上的
javadoc
,以获得更好的理解。实现接口的方法是

public class MyAction extends ActionSupport implements ServletContextAware
{

    private ServletContext servletCtx;

    public void setServletContext(ServletContext context)
    {
        this.servletCtx = context;
    }

    public String execute()
    {
        //Use the servletCtx variable to perform your logic here
        return SUCCESS;
    }

}

有很多方法可以做到这一点,尽管Struts2提供了一种干净的方式来访问
ServletContext
,如
Uchenna
所述

有一种方法可以访问此文件

String relativePath = "/META-INF/MANIFEST.MF";
String diskPath = getServletContext().getRealPath(relativePath );
File file = new File(diskPath);
您可以通过实现
ServletContextAware
来访问
ServletContext
。 另一种方法是在
getResourceAsStream()
like的帮助下,以
InputStream
的形式访问它

InputStream is= getServletContext().getResourceAsStream("/META-INF/MANIFEST.MF");

正如Steven在评论中提到的,更喜欢
getResourceAsStream()
,因为
getRealPath()
对于未爆炸战争可以为空。

其中是
MANIFEST.MF
文件的位置。您在问题中没有指定这一点?为什么需要清单文件?它对于读取版本信息或生成过程中可能添加的任何其他生成特定信息(例如,git分支或变更集哈希、生成时间等)非常有用。您最好使用
getResourceAsStream()
<代码>getRealPath()
如果您的应用程序在未爆炸的战争中运行,则可以返回null。@Stevenbeintez:同意您的看法,谢谢您的指针,因为我忽略了它