Если установлен файл конфигурации веб-приложения [дубликат]

Вот вам один лайнер:

singleton = lambda c: c()

Вот как вы его используете:

@singleton
class wat(object):
    def __init__(self): self.x = 1
    def get_x(self): return self.x

assert wat.get_x() == 1

Ваш объект получает экземпляр с нетерпением. Это может быть или не быть тем, что вы хотите.

195
задан BalusC 10 January 2016 в 11:57
поделиться

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 предполагается, что они будут помещены в один из корней, которые покрываются классом по умолчанию для webapp, например webapp /WEB-INF/lib и /WEB-INF/classes, /lib сервера или JDK / JRE /lib. Если файл свойств является webapp-специфическим, лучше всего поместить его в /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");
// ...

Однако видимость файла свойств зависит затем на класс загрузчика, о котором идет речь. Это видно только для того же загрузчика классов, что и тот, который загружал класс. Таким образом, если класс загружается, например, server common classloader вместо загрузчика классов webapp, а файл свойств находится внутри самого webapp, а затем он невидим. Загрузчик контекстного класса - это ваша самая безопасная ставка, поэтому вы можете поместить файл свойств «всюду» в путь к классам и / или вы намерены переопределить сервер, предоставленный с помощью webapp.


2. Поместите его в webcontent

Чтобы вы могли загрузить его с помощью ServletContext#getResourceAsStream() с относительным путем webcontent:

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, вы не можете использовать путь к файловой системе диска. Этот путь, в свою очередь, может быть передан в веб-приложение как аргумент VM или системное свойство. В качестве меры предосторожности никогда не используйте getRealPath() . Все изменения в папке развертывания будут потеряны при повторном развертывании по той простой причине, что изменения не будут возвращены в исходный файл WAR.

См. Также:

423
ответ дан Community 21 August 2018 в 03:13
поделиться
  • 1
    «Я лично предпочитаю поместить его в путь класса вне проекта (добавить новый путь к пути к классам) & quot; смущенный, можете ли вы привести пример? – Blankman 18 December 2011 в 04:32
  • 2
    @Blankman Он, вероятно, означает создание новой папки, размещение всех ваших настраиваемых файлов конфигурации и добавление этой папки в путь к классам. Итак: 1) Создайте папку с именем «appconfs» где-нибудь (может быть даже /etc/appconfs 2) Добавьте эту папку в путь к классам сервера / домена приложения. Второй шаг - конкретный сервер приложений, я не думаю, что для этого есть общий пример. – Tuukka Mustonen 3 January 2012 в 17:15
  • 3
    Re: 2: Почему оба "WEB-INF/filename.properties" и "/WEB-INF/filename.properties" (обратите внимание на / в начале) работают? Есть ли какая-то причина предпочитать одну над другой? – Mr_and_Mrs_D 7 September 2013 в 15:57
  • 4
    Я был исправлен в этом выпуске в течение последнего дня. Я не могу загрузить файл свойств. Я могу загрузить его из двух мест. Один из них - системный каталог, а один - локальный. Он работает с localhost. Но я хочу развернуть его на амазонке. – Arun Raja 24 April 2015 в 07:25
  • 5
    Я использую NetBeans IDE и сохраняю файл свойств в веб-страницах / ресурсах. Я пытаюсь получить к нему доступ как «./ Web Pages / resources / config.properties». Я не могу получить к нему доступ. Пожалуйста, помогите мне. – Arun Raja 24 April 2015 в 07:27

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

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

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

Итак, я голосую за то, в WEB-INF/commonConfFolder/filename.properties, next в папку классов, которая является параметром Balus 2.

6
ответ дан Ahmed Ashour 21 August 2018 в 03:13
поделиться
  • 1
    если вы поместите свой файл конфигурации в подпапку WEB INF, то как вы ее достигнете? Мне не повезло: «config Files / prop.properties» – JesseBoyd 8 September 2017 в 21:00
  • 2
    ОК, это работает, помещая файл свойств в «Ресурсы Java / src /», он не работает из одного из моих пакетов и должен находиться в корне src. ваше предупреждение о том, что папка классов получает nuked, является серьезной проблемой. – JesseBoyd 8 September 2017 в 21:03

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

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

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

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

1
ответ дан Bill the Lizard 21 August 2018 в 03:13
поделиться
  • 1
    я поместил в папку веб-страниц, но не смог получить к нему файл. Не найдена ошибка. Как установить путь – sansknwoledge 29 January 2010 в 11:34
  • 2
    если ваш файл попадает в папку WEB-INF / classes, он автоматически устанавливается в путь к классам – Kalpak 30 January 2010 в 09:28

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

3
ответ дан Taylor Leese 21 August 2018 в 03:13
поделиться
  • 1
    привет спасибо за идею, но он говорит мне, что не может найти указанный файл, да его проблема с путями, как указать путь – sansknwoledge 29 January 2010 в 11:32

Пример: в файле 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 вы можете объявить свои свойства следующим образом:

Для Ex:

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.
4
ответ дан Vikdor 21 August 2018 в 03:13
поделиться
0
ответ дан Thar 31 October 2018 в 22:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: