3

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

我可以使用这两个 server.xml 片段中的任何一个,它们似乎都可以工作。两者似乎都成功加载了这个 URL 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>
4

2 回答 2

4

这是使用多种不同方式提取不属于 WAR 或已展开目录的资源的结果。坦率地说,这是一个早就应该清理的烂摊子。为 Servlet 3.1(即 Tomcat 8)提议的“覆盖”(或任何它最终被称为的)特性已经促使进行了重大清理。所有当前的实现都将统一为一个实现。虽然它并不漂亮,而且需要一段时间才能完成。

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

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

于 2012-06-21T22:27:43.943 回答
1

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

这个 Java 代码的结果是不同的。我仍然不知道为什么。

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

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

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

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

D:\path\to\images

现在,如果有人可以真正解释这一点。:-)

于 2012-06-21T13:24:54.810 回答