Это твой выбор. В архиве веб-приложений Java (WAR) есть три основных способа:
1. Поместите это в classpath
Так что вы можете загрузить его ClassLoader#getResourceAsStream()
с помощью пути к классам:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("foo.properties");
// ...
Properties properties = new Properties();
properties.load(input);
Здесь foo.properties
предполагается поместить в один из корней, которые охватываются стандартным путем к классу веб-приложения, например, веб-приложение /WEB-INF/lib
и /WEB-INF/classes
сервер /lib
, или JDK / JRE /lib
. Если файл свойств зависит от веб-приложения, лучше всего поместить его в /WEB-INF/classes
. Если вы разрабатываете стандартный проект WAR в IDE, поместите его в src
папку (исходную папку проекта). Если вы используете проект Maven, поместите его в /main/resources
папку.
В качестве альтернативы вы можете также поместить его где-то за пределами пути к классам по умолчанию и добавить его путь к пути к классам сервера приложений. Например, в Tomcat вы можете настроить его как shared.loader
свойство Tomcat/conf/catalina.properties
.
Если вы поместили foo.properties
его в структуру пакета Java, как com.example
, то вам нужно загрузить его, как показано ниже
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("com/example/foo.properties");
// ...
Обратите внимание, что этот путь загрузчика класса контекста не должен начинаться с /
. Только когда вы используете «относительный» загрузчик классов, такой как SomeClass.class.getClassLoader()
, тогда вам действительно нужно начинать его с /
.
ClassLoader classLoader = getClass().getClassLoader();
InputStream input = classLoader.getResourceAsStream("/com/example/foo.properties");
// ...
Однако видимость файла свойств зависит от загрузчика классов. Он виден только тому загрузчику классов, который загрузил класс. Таким образом, если класс загружается, например, общим загрузчиком классов сервера вместо загрузчика классов веб-приложения, и файл свойств находится внутри самого веб-приложения, то он невидим. Загрузчик классов контекста - ваша самая безопасная ставка, поэтому вы можете поместить файл свойств «везде» в путь к классам, и / или вы намерены иметь возможность переопределить файл, предоставленный сервером, из веб-приложения.
2. Поместите это в веб-контент
Так что вы можете загрузить его ServletContext#getResourceAsStream()
с помощью относительного к веб-пути пути:
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/foo.properties");
// ...
Обратите внимание, что я продемонстрировал размещение файла в /WEB-INF
папке, иначе он был бы общедоступным для любого веб-браузера. Также отмечу , что ServletContext
в любом HttpServlet
классе просто доступном унаследованные GenericServlet#getServletContext()
и Filter
пути FilterConfig#getServletContext()
. В случае, если вы не в классе сервлетов, это обычно просто инъекция через @Inject
.
3. Поместите его в файловую систему локального диска
Так что вы можете загрузить его обычным java.io
способом, указав абсолютный путь к файловой системе на локальном диске:
InputStream input = new FileInputStream("/absolute/path/to/foo.properties");
// ...
Обратите внимание на важность использования абсолютного пути. Относительные пути файловой системы на локальном диске абсолютно запрещены в веб-приложении Java EE. Смотрите также первую ссылку "Смотрите также" ниже.
Какой выбрать?
Просто взвесьте преимущества / недостатки по вашему собственному мнению в отношении ремонтопригодности.
Если файлы свойств являются «статическими» и их не нужно менять во время выполнения, вы можете сохранить их в WAR.
Если вы предпочитаете иметь возможность редактировать файлы свойств извне веб-приложения без необходимости каждый раз перестраивать и повторно развертывать WAR-файл, то поместите его в путь к классам вне проекта (при необходимости добавьте каталог в путь к классам).
Если вы предпочитаете иметь возможность редактировать файлы свойств программно из веб-приложения, используя Properties#store()
метод, поместите его за пределы веб-приложения. Как Properties#store()
требуется Writer
, вы не можете использовать путь к файловой системе диска. Этот путь, в свою очередь, может быть передан веб-приложению в качестве аргумента виртуальной машины или системного свойства. В качестве меры предосторожности никогда не используйтеgetRealPath()
. Все изменения в папке развертывания будут потеряны при повторном развертывании по той простой причине, что изменения не отражаются обратно в исходном файле WAR.
Смотрите также: