一个简单的问题:在Tomcat7中,使用extraResourcePaths和别名访问应用程序外部的目录有什么区别?
我可以使用这两个server.xml代码片段之一,它们似乎都可以工作。两者似乎都成功加载了此URL :http://localhost/app/images/box.jpg。使用一个相对于另一个有优势吗?
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>
这是由于采用了多种不同的方式来提取不属于WAR或展开目录的资源的结果。坦白说,这是一个早该清理的烂摊子。为Servlet 3.1(即Tomcat 8)建议的“覆盖”(或最终被称为)功能已引起了重大清理。当前所有的实现将被统一为一个实现。不过这还不是很漂亮,而且还需要一段时间才能完成。
别名被视为Web应用程序资源的外部。DirContext在检查其内部资源之前会先检查别名。因此,当您请求真实路径时,您将获得原始路径。
如果使用extraResourcePaths,它们将被视为Web应用程序资源的一部分。看来Eclipse已将应用程序资源的副本触发到工作目录。通常这样做是为了避免文件锁定。由于extraResourcePaths被视为web应用程序的一部分,因此它们也将被复制,并且getRealPath()报告复制的位置,因为这是Tomcat从中提供资源的位置。