我一直在尝试使用主机的应用程序库和上下文的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("/");
仅在网络应用程序代码中才能正常运行?
答案 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中有效。