Где разместить и как читать файлы ресурсов конфигурации в приложении на основе сервлетов?
в моем веб-приложении я должен отправить по электронной почте набор предопределенных пользователей, таких как [email protected], поэтому я хочу добавить это к .properties файл и доступ к нему при необходимости. Это правильная процедура, если да, то где я должен разместить этот файл? Я использую IDE Netbeans, которая имеет две отдельные папки для исходных и JSP-файлов.
6 ответов:
это ваш выбор. Существует в основном три способа в архиве веб-приложений Java (WAR):
1. Положить его в classpath
, так что вы можете загрузить его с помощью
ClassLoader#getResourceAsStream()с classpath-относительный путь:ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); InputStream input = classLoader.getResourceAsStream("foo.properties"); // ... Properties properties = new Properties(); properties.load(input);здесь
foo.propertiesдолжен быть помещен в один из корней, которые покрыты по умолчанию classpath веб-приложения, например webapp в/WEB-INF/libи/WEB-INF/classes, , или . Если propertiesfile-это веб-приложение, лучше всего разместить его в/WEB-INF/classes. Если вы разрабатываете стандартный военный проект в IDE, поместите его вsrcпапка (исходная папка проекта). Если вы используете проект Maven, поместите его в .вы также можете поместить его где-то за пределами пути к классам по умолчанию и добавить его путь к пути к классам сервера приложений. Например, в 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"); // ...однако видимость файла свойств зависит тогда от рассматриваемого загрузчика классов. Он виден только для того же загрузчика классов, что и тот, который загрузил класс. Так, если класс загружается например, обычный загрузчик классов сервера, а не веб-приложение classloader, и файл свойств внутри себя веб-приложение, то она невидима. Загрузчик классов контекста-это ваша самая безопасная ставка, поэтому вы можете разместить файл свойств "везде" в пути к классу и/или вы собираетесь переопределить серверный файл из веб-приложения.
2. Поместите его в webcontent
, так что вы можете загрузить его по
ServletContext#getResourceAsStream()с WebContent-относительный путь:InputStream input = getServletContext().getResourceAsStream("/WEB-INF/foo.properties"); // ...обратите внимание, что я показал, чтобы поместить файл в
/WEB-INFпапка, в противном случае она была бы общедоступной для любого веб-браузера. Также обратите внимание, чтоServletContextв любомHttpServletкласс просто доступен по наследствуGenericServlet#getServletContext()иFilterbyFilterConfig#getServletContext(). В случае, если вы не находитесь в классе сервлетов, он обычно просто вводится через@Inject.
3. Поместите его в локальную дисковую файловую систему
, так что вы можете загрузить его обычным
java.ioпуть с абсолютным локальным диском путь к файловой системе:InputStream input = new FileInputStream("/absolute/path/to/foo.properties"); // ...обратите внимание на важность использования абсолютного пути. Относительные пути к локальной дисковой файловой системе являются абсолютным запретом в веб-приложении Java EE. См. также первую ссылку" см. также " ниже.
что выбрать?
просто взвесить преимущества/недостатки в код собственное мнение о ремонтопригодности.
если файлы свойств являются "статическими" и никогда не нуждаются в изменении во время выполнения, то вы можете сохранить их в войне.
если вы предпочитаете иметь возможность редактировать файлы свойств из-за пределов веб-приложения без необходимости перестраивать и повторно развертывать WAR каждый раз, затем поместите его в путь к классам вне проекта (при необходимости добавьте каталог в путь к классам).
если вы предпочитаете иметь возможность редактировать файлы свойств программно из веб-приложения с помощью
Properties#store()метод, Поместите его за пределы веб-приложения. Как тоProperties#store()требуетWriter, вы не можете обойти с помощью пути файловой системы диска. Этот путь, в свою очередь, может быть передан веб-приложению в качестве аргумента виртуальной машины или системного свойства. В качестве меры предосторожности, никогда использоватьgetRealPath(). Все изменения в папке развертывания будут потеряны при повторном развертывании для по той простой причине, что изменения не отражены в исходном файле WAR.Читайте также:
слово предупреждения: если вы поместите конфигурационные файлы в свой
WEB-INF/classesпапка, и ваша IDE, скажем Eclipse, делает чистую/перестроенную, она будет уничтожать ваши файлы conf, если они не были в исходном каталоге Java. Отличный ответ BalusC намекает на это в варианте 1, но я хотел бы добавить акцент.я узнал, что если вы "копируете" веб-проект в Eclipse, он делает чистую/перестроенную из любых исходных папок. В моем случае я добавил "связанный исходный код dir" из нашей библиотеки POJO java, это было бы скомпилировать в . Выполнение очистки / перестроения в этом проекте (а не в проекте веб-приложения) вызвало ту же проблему.
Я думал о том, чтобы поместить мои конфы в папку POJO src, но эти конфы предназначены для сторонних библиотек (например, Quartz или URLRewrite), которые находятся в
WEB-INF/libпапка, так что это не имело смысла. Я планирую протестировать его в папке "src" веб-проектов, когда я дойду до него, но эта папка в настоящее время пуста и в ней есть файлы conf неэлегантный.поэтому я голосую за размещение файлов conf в
WEB-INF/commonConfFolder/filename.properties,далее в папку classes, которая является опцией Balus 2.
например, в интернете.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>и чат.свойства вы можете объявить свои свойства следующим образом
Например :
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.
Он просто должен быть в пути к классам (aka убедитесь, что он заканчивается в /WEB-INF/classes in .война как часть сборки).
вы можете использовать свою исходную папку, поэтому всякий раз, когда вы строите, эти файлы автоматически копируются в каталог классов.
вместо того, чтобы использовать файл свойств, использовать XML-файл.
Если данные слишком малы, вы можете даже использовать веб.XML для доступа к свойствам.
обратите внимание, что любой из этих подходов потребует перезагрузки сервера приложений для отражения изменений.
предположим, что ваш код ищет файл сказать приложение.свойства. Скопировать этот файл в любую папку и добавить этот каталог в переменную окружения classpath, путем создания setenv.sh в каталог bin сервера Tomcat.
в вашем setenv.sh tomcat( если этот файл не существует, создайте его, tomcat загрузит это setenv.sh файл.
#!/bin/sh CLASSPATH="$CLASSPATH:/home/user/config_my_prod/"у вас не должно быть ваших файлов свойств ./веб-приложения/веб-инф/классов/приложение.свойства
загрузчик класса Tomcat переопределит с помощью одного из WEB-INF / classes/
хорошее чтение: https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html
Comments