简单问题:在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>
答案 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
现在,如果有人能够解释这一点。 : - )