Где разместить и как прочитать файлы ресурсов конфигурации в приложении на основе сервлетов? - PullRequest
209 голосов
/ 29 января 2010

В моем веб-приложении я должен отправить электронное письмо заранее определенным пользователям, таким как finance@xyz.com, поэтому я хочу добавить его в файл .properties и получить к нему доступ при необходимости. Это правильная процедура, если да, то где мне разместить этот файл? Я использую среду IDE NetBeans, в которой есть две отдельные папки для исходных файлов и файлов JSP.

Ответы [ 6 ]

448 голосов
/ 29 января 2010

Это ваш выбор. В архиве веб-приложений 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.

Смотри также:

8 голосов
/ 19 июня 2014

Слово предупреждения: если вы поместите файлы конфигурации в вашу папку WEB-INF/classes, и ваша IDE, скажем, Eclipse, выполнит очистку / перестройку, она уничтожит ваши файлы conf, если они не были в исходном каталоге Java. Отличный ответ BalusC намекает на это в варианте 1, но я хотел добавить акцент.

Я усвоил трудный путь, что если вы «копируете» веб-проект в Eclipse, он выполняет чистую / перестройку из любых исходных папок. В моем случае я добавил «dir связанный источник» из нашей библиотеки Java POJO, он будет компилироваться в папку WEB-INF/classes. Выполнение очистки / перестройки в этом проекте (не в проекте веб-приложения) вызвало ту же проблему.

Я думал о том, чтобы поместить свои файлы в папку POJO src, но все эти файлы предназначены для сторонних библиотек (таких как Quartz или URLRewrite), которые находятся в папке WEB-INF/lib, так что это не имело смысла. Я планирую проверить, поместив его в папку «src» веб-проектов, когда доберусь до нее, но в данный момент эта папка пуста, и в ней есть файлы conf, кажется, не элегантные.

Таким образом, я голосую за помещение файлов conf в WEB-INF/commonConfFolder/filename.properties, next в папку классов, которая является вариантом 2 Balus.

6 голосов
/ 15 августа 2012

Пример: в файле web.xml тег

<context-param>
        <param-name>chatpropertyfile</param-name>
        <!--  Name of the chat properties file. It contains the name and description                   of rooms.-->     
        <param-value>chat.properties</param-value>
    </context-param>

И chat.properties вы можете объявить свои свойства, как это

Например:

Jsp = Discussion about JSP can be made here.
Java = Talk about java and related technologies like J2EE.
ASP = Discuss about Active Server Pages related technologies like VBScript and JScript etc.
Web_Designing = Any discussion related to HTML, JavaScript, DHTML etc.
StartUp = Startup chat room. Chatter is added to this after he logs in.
5 голосов
/ 29 января 2010

Он просто должен находиться в пути к классам (иначе убедитесь, что он заканчивается в / WEB-INF / classes в .war как часть сборки).

3 голосов
/ 29 января 2010

Вы можете использовать исходную папку, чтобы при сборке эти файлы автоматически копировались в каталог классов.

Вместо использования файла свойств используйте файл XML.

Если данные слишком малы, вы даже можете использовать web.xml для доступа к свойствам.

Обратите внимание, что любой из этих подходов потребует перезапуска сервера приложений, чтобы изменения были отражены.

1 голос
/ 04 октября 2018

Предположим, ваш код ищет файл, скажем, app.properties. Скопируйте этот файл в любой каталог и добавьте этот каталог в classpath, создав файл setenv.sh в каталоге bin в tomcat.

В вашем setenv.sh tomcat (если этот файл не существует, создайте его, tomcat загрузит этот файл setenv.sh). #!/bin/sh CLASSPATH="$CLASSPATH:/home/user/config_my_prod/"

Вы не должны иметь свои файлы свойств в ./webapps//WEB-INF/classes/app.properties

Загрузчик классов Tomcat переопределит его из WEB-INF / classes /

Хорошее чтение: https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...