Нашел ответ: наверное, я просто запутался.Пожалуйста, посмотрите мой ответ, если вы заинтересованы.
В журналах catalina.out показано, что init-параметр webappBasePath
вообще не задан: если бы он был, то было бы: init-param 'webappBasePath' = <something>
сообщениев catalina.out
файле журнала.
Следует отметить, что выходные данные ServletContext.getRealPath()
отличаются между версиями Tomcat, я думаю, это ошибка в моем коде сервлета.
Конечно, его можно установить с помощью <init-params>
в файле WEB-INF/web.xml
.
Я добавил (внутри тега <servlet>
):
<init-param>
<param-name>webappBasePath</param-name>
<param-value>/var/tmp/somewebapp/files/./</param-value>
</init-param>
</servlet>
tomcat 5 log show
init-param 'webappBasePath' = /var/tmp/somewebapp/files/./
getRealPath(webappBasePath) = /usr/share/tomcat5/webapps/XSLT_HIQ/var/tmp
/somewebapp/files/./
tomcat8.5 log
init-param 'webappBasePath' = /var/tmp/somewebapp/files/./
getRealPath(webappBasePath) = /adtech/tomcat/webapps/XSLT_HIQ/var/tmp
/somewebapp/files//
NOTE ServletContext.getRealPath()
на tomcat8.5 есть«нормализация» пути путем удаления компонента с одной точкой.
EDIT
Старые версии tomcat, в которых используется следующий код в ApplicationContext
(пример из svntc5.0.x )
public String getRealPath(String path) {
// ...
File file = new File(basePath, path);
return (file.getAbsolutePath());
}
В то время как более новые версии используют getRealPath
от StandardContext
(строки 4319-4349 здесь )
public String getRealPath(String path) {
if (resources != null) {
// ...
WebResource resource = resources.getResource(path);
String canonicalPath = resource.getCanonicalPath();
// ...
return canonicalPath;
}
// ...
}
веб-ресурс getCanonicalPath()
звонит java.io.File#getCanonicalPath()
который
удаляет избыточные имена, такие как '.'и '..' из пути
(скопировано из javadocs для файла # getCanonicalPath )