Servlet/Tomcat相对文件路径

3

在Tomcat Servlet应用程序中放置文件的位置,以使它们相对于页面更加可见?

更多细节: 我正在开发一个servlet页面,同时使用一个外部库。该库在外部加载的XML文件上有很大的依赖(相对文件路径)。因此,我需要将这些XML文件放置在servlet的运行目录中。

Tomcat服务器中是否有一种方式可以相对地访问文件?


1
你可以使用 System.getProperty("user.dir") 来获取当前工作目录。打印它,你就知道在哪里放置你的文件了... - Moritz Petersen
从那里,您可以访问整个文件结构。非常好的评论Moritz。 - Ewald
是的,我做过类似的想法,我已经写入了该目录中的一个文件,但结果证明它是Tomcat创建的临时目录... - Betamoo
所以我在询问是否有一种方法可以告诉Tomcat将某些文件复制到这个目录中。 - Betamoo
可能会有趣的是提到你正在谈论哪个库。 - W. Goeman
3个回答

3

当一个Web应用程序被部署到Tomcat上时,Web应用程序的根目录就变成了$CATALINA_HOME/webapps/YOUR_WEB_APP/。

因此,如果使用一个servlet来访问位于Web应用程序根目录下路径中的XML文件,您可以直接使用以下内容:

request.getServletContext().getResourceAsStream("PATH/TO/YOUR/XML_FILE.xml")

这将把XML文件加载为InputStream。当然,如果你想要访问文件本身,你可以使用getResource(String resource)方法获取一个URL,从中可以获取一个File对象,如下所示(包括替代方法):

File f;
try {
  f = new File(url.toURI());
} catch(URISyntaxException e) {
  f = new File(url.getPath());
}

编辑:为了使它们相对于Web浏览器可见,只需将它们保留在./WEB-INF和./META-INF目录之外。


我无法访问外部库的代码... 我只知道它使用相对路径加载文件。 - Betamoo
我想我现在有些困惑了。你想做什么?只是让外部库可以访问XML文件吗?如果是这样,那么你的相对路径就是应用程序根目录。 - Zach

1
如果你所说的这个库要在类路径上搜索文件(就像Hibernate或Log4J会做的那样),那么你必须将XML文件放在WEB-INF中。然而,我建议你不要手动操作。你可以将文件放在应用程序的源目录中,这将确保文件被部署到正确的位置。

-1

这是一个老问题。我正在使用Tomcat 9进行工作。我已经成功地将Tomcat安装目录作为基础。(CATALINA_HOME)例如,ROOT中文件的相对路径是“webapps/ROOT/someDir/fileName”

抱怨重复答案的地方是处理重复问题。


这个假设仅适用于默认的Tomcat配置。如果有人设置了显式的docBase(请参阅上下文容器文档),Web应用程序可能在任何地方。 - David Moles
但我怀疑如果是这种情况,他会知道他设置了哪个docBase。 - Roger F. Gay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接