访问Tomcat中应用程序的上下文根目录中的文件

时间:2016-03-08 13:18:09

标签: java tomcat

我一直在尝试使用主机的应用程序库和上下文的doc base来获取正在部署的应用程序的上下文根。

try {
    if (context != null) {
        //  Value of the following variable depends on various conditions. Sometimes you get just the webapp
        //  directory name. Sometime you get absolute path the webapp directory or war file.
        String webappFilePath;
        Host host = (Host) context.getParent();
        String appBase = host.getAppBase();
        File canonicalAppBase = new File(appBase);
        if (canonicalAppBase.isAbsolute()) {
            canonicalAppBase = canonicalAppBase.getCanonicalFile();
        } else {
            canonicalAppBase = new File(PathUtils.getCatalinaBase().toString(), appBase).getCanonicalFile();
        }

        String docBase = context.getDocBase();
        File webappFile = new File(docBase);
        if (webappFile.isAbsolute()) {
            webappFilePath = webappFile.getCanonicalPath();
        } else {
            webappFilePath = (new File(canonicalAppBase, docBase)).getPath();
        }
        return Paths.get(webappFilePath);
    } else {
        throw new ApplicationServerException("Context cannot be null");
    }
} catch (IOException ex) {
    throw new ApplicationServerException("Error while generating webapp file path", ex);
}

访问上下文根目的是访问我添加到/ WEB-INF文件夹的自定义配置文件。

在进一步研究时,我发现了以下访问应用程序文件夹中的资源的简单方法。

How to get file system path of the context root of any application

但是当我使用这里定义的方法时,我总是为上下文根获取一个空值。

Path contextWebAppDescriptor = Paths.
                        get(context.getServletContext().getRealPath("/"), Constants.WEBAPP_RESOURCE_FOLDER,
                                Constants.WEBAPP_DESCRIPTOR);

请考虑两个常数:

public static final String WEBAPP_RESOURCE_FOLDER = "WEB-INF";
public static final String WEBAPP_DESCRIPTOR = "wso2as-web.xml";

我误解了这种方法的正确用法吗?我们可以只使用方法

context.getServletContext().getRealPath("/");

仅在网络应用程序代码中才能正常运行?

2 个答案:

答案 0 :(得分:1)

更好的方法,恕我直言,将使用ServletContext.getResourcePaths()方法。

这,基本上是:

  

返回其中所有资源路径的类似目录的列表   最长子路径与提供的路径匹配的Web应用程序   参数。

因此,要获取WEB-INF文件夹中的所有内容,您可以执行以下操作:

Set<String> paths = servletContext.getResourcePaths("/WEB-INF/");

然后遍历paths以获取相关资源。资源结尾/表示子目录。

答案 1 :(得分:0)

我设法通过使用ServletContext.getResourceAsStream()来解决此问题,InputStream可用于获取指定资源的{{3}}。

就我所知,这就是Tomcat本身执行web.xml读取的方式。必须注意的是,此方法在LifeCycle事件CONFIGURE_START_EVENT而非BEFORE_START_EVENT中有效。