一尘不染

如何读取在Apache Tomcat中运行的Web应用程序的清单文件?

java

我有一个包含清单文件的webapp,在执行蚂蚁构建任务时,我在其中写入应用程序的当前版本。清单文件已正确创建,但是在运行时尝试读取清单文件时,会出现一些奇怪的副作用。我在清单中读取的代码是这样的:

    InputStream manifestStream = Thread.currentThread()
                                 .getContextClassLoader()
                                 .getResourceAsStream("META-INFFFF/MANIFEST.MF");
    try {
        Manifest manifest = new Manifest(manifestStream);
        Attributes attributes = manifest.getMainAttributes();
        String impVersion = attributes.getValue("Implementation-Version");
        mVersionString = impVersion;
    }
    catch(IOException ex) {
        logger.warn("Error while reading version: " + ex.getMessage());
    }

当我将eclipse附加到tomcat时,我看到上面的代码起作用了,但是它似乎得到了与我期望的清单文件不同的清单文件,由于蚂蚁版本和构建时间戳都不同,所以我可以看出来。然后,我将“ META-INFFFF”放入其中,上面的代码仍然有效!这意味着我正在阅读其他清单,而不是我的清单。我也试过

this.getClass().getClassLoader().getResourceAsStream(...)

但是结果是一样的。从tomcat中运行的Webapp内部读取清单文件的正确方法是什么?

编辑:谢谢到目前为止的建议。另外,我要指出,我正在运行Tomcat独立; 我从命令行启动它,然后将其附加到Eclipse调试器中正在运行的实例。那不应该有所作为,不是吗?


阅读 285

收藏
2020-03-24

共1个答案

一尘不染

也许你的副作用来自几乎所有jar都包含MANIFEST.MF的事实,而你没有得到正确的jar。要从Web应用程序读取MANIFEST.MF,我会说:

ServletContext application = getServletConfig().getServletContext();
InputStream inputStream = application.getResourceAsStream("/META-INF/MANIFEST.MF");
Manifest manifest = new Manifest(inputStream);

请注意,由于Eclipse与类加载器一起运行,因此从Eclipse运行Tomcat不同于单独运行Tomcat。

2020-03-24