这是由于采用了多种不同的方式来提取不属于WAR或展开目录的资源的结果。坦白说,这是一个早该清理的烂摊子。为Servlet 3.1(即Tomcat 8)建议的“覆盖”(或最终被称为)功能已引起了重大清理。当前所有的实现将被统一为一个实现。不过这还不是很漂亮,而且还需要一段时间才能完成。
别名被视为Web应用程序资源的外部。DirContext在检查其内部资源之前会先检查别名。因此,当您请求真实路径时,您将获得原始路径。
如果使用extraResourcePaths,它们将被视为Web应用程序资源的一部分。看来Eclipse已将应用程序资源的副本触发到工作目录。通常这样做是为了避免文件锁定。由于extraResourcePaths被视为web应用程序的一部分,因此它们也将被复制,并且getRealPath()报告复制的位置,因为这是Tomcat从中提供资源的位置。