Это ваш выбор. В архиве веб-приложений 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
сервера или /lib
JDK / JRE. Если файл свойств зависит от веб-приложения, лучше всего поместить его в /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. Поместите это в webcontent
Так что вы можете загрузить его с помощью 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.
Смотри также: