Ответ 1
ClassLoader#getResource()
обнаруживает только ресурсы класса, а не веб-ресурсы. sitemap.xml
- явно веб-ресурс. Вы должны использовать ServletContext#getResource()
вместо своего JSF-аналога ExternalContext#getResource()
— как указано в вашей истории вопроса, вы используете JSF.
URL url = externalContext.getResource("/sitemap.xml");
Или, только для чтения:
InputStream input = externalContext.getResourceAsStream("/sitemap.xml");
Как правило, вы не должны быть заинтересованы вообще в используемом пути к файловой системе. Обычно это временное расположение папки или даже место в памяти.
Не привязанный к конкретному вопросу, пишущий к нему - это целая история. Ни ресурсы классов, ни веб-ресурсы не предназначены для записи изнутри приложения Java EE. Даже если это возможно (т.е. Это не ресурс в памяти), все изменения будут полностью потеряны всякий раз, когда вы повторно развертываете WAR или даже когда вы просто перезагружаете сервер, по той простой причине, что эти изменения не отражаются в оригинале WAR. Учитывая конкретное имя файла "sitemap.xml", у меня создается впечатление, что вы создали более постоянное хранилище. В этом случае я настоятельно рекомендую искать другое решение. Например. хранить файл по фиксированному пути вне WAR, или только структуру данных в базе данных.