Как получить корневой путь веб-проекта в java EE

Я использую java EE для своего динамического веб-проекта. И я поместил файл sitemap.xml в корневой путь. Теперь мне нужно изменить путь к этому файлу. Я пытаюсь:

String path = getClass().getClassLoader().getResource(".").getPath() +"\\sitemap.xml";

но The system cannot find the file specified. Я использую окно, что мне нужно изменить, когда я загружаю свой проект в Linux-хостинг?

Ответ 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, или только структуру данных в базе данных.

Ответ 2

Прежде всего, попробуйте не использовать разделитель файлов Windows "\", потому что он зависит от платформы. Вместо этого вы можете использовать "/" (насколько я помню, он должен быть заменен JVM на подходящий разделитель) или, что еще лучше, File.separator.