Tomcat的extraResourcePaths与访问外部目录的别名之间的区别

时间:2012-06-21 12:58:46

标签: tomcat tomcat7

简单问题:在Tomcat7中,使用extraResourcePaths和别名来访问应用程序之外的目录有什么区别?

我可以使用这两个server.xml片段中的任何一个,它们似乎都可以工作。两者似乎都成功加载了此网址:http://localhost/app/images/box.jpg。使用一个优于另一个是否有优势?

<Context docBase="Eclipse_Project" path="/app"
        reloadable="true" source="org.eclipse.jst.j2ee.server:Eclipse_Project"
        aliases="/images=D:\path\to\images"/>

<Context docBase="Eclipse_Project" path="/app"
        reloadable="true" source="org.eclipse.jst.j2ee.server:Eclipse_Project">
        <Resources className="org.apache.naming.resources.VirtualDirContext"
                extraResourcePaths="/images=D:\path\to\images"/>
</Context>

2 个答案:

答案 0 :(得分:4)

这是因为有多种不同的方式来提取不属于WAR或爆炸目录的资源。坦率地说这是一个混乱,早就应该清理了。为Servlet 3.1(即Tomcat 8)提出的'覆盖'(或者它最终被调用的任何特性)功能已促使进行大规模清理。所有当前的实现将统一到单个实现中。虽然它不漂亮,但需要一段时间才能完成。

别名被视为Web应用程序资源的外部。 DirContext在检查别名之前检查其内部资源。因此,当您请求真实路径时,您将获得原始路径。

如果使用extraResourcePaths,则将它们视为Web应用程序资源的一部分。看起来Eclipse已经触发了应用程序资源的副本到工作目录。这通常是为了避免文件锁定。由于extraResourcePaths被视为webapp的一部分,因此它们也会被复制,getRealPath()会报告复制的位置,因为这是Tomcat从中提供资源的地方。

答案 1 :(得分:1)

经过进一步调查,我发现了这种差异。

此Java代码的结果不同。我还是不知道为什么。

String path = getServletContext().getRealPath("/images");

使用extraResourcePaths,路径如下,这是Eclipse爆炸我的网络应用程序而不是有效目录的文件夹。

C:\Projects\.metadata\.plugins\org.eclipse.wst.server.core\tmp2\wtpwebapps\Eclipse_Project\images

使用别名,路径在下面,是我实际需要的。

D:\path\to\images

现在,如果有人能够解释这一点。 : - )