Как прочитать файл свойств, размещенный вне войны? - PullRequest
5 голосов
/ 01 июня 2011

В настоящее время я работаю над веб-приложением.Это использует только jsps и сервлеты.Это небольшое приложение.Прямо сейчас я поместил все детали DataSource в служебный класс DAO.Я хочу поместить эти детали в файл свойств, который можно поместить вне войны, чтобы в зависимости от среды мы могли изменять эти значения, не влияя на войну.Как мне этого добиться?

Ответы [ 6 ]

4 голосов
/ 20 января 2012

Вот как я это делаю:

Добавьте следующее в файл context.xml (папка conf в каталоге установки tomcat). Вы можете изменить атрибут имени; и в значении укажите путь к папке, в которой у вас есть файлы свойств.

<Environment name="config" value="C:\Program files\my app\"  
         type="java.lang.String" override="false"/>

Затем в вашем классе утилит вы можете получить такой файл: (в «java: comp / env / config» замените «config» значением атрибута «name», который вы использовали в context.xml) *

String folderName = null;
Properties properties = new Properties();
try {
   InitialContext context = new InitialContext();
   folderName = (String) context.lookup("java:comp/env/config");
} catch (NamingException ex) {
   System.out.println("exception in jndi lookup");
}
if(folderName != null) {
   File configFile = new File(folderName + "yourfile.properties");
   try {
       InputStream is = new FileInputStream(configFile);
       properties.load(is);
   } catch(IOException ex) {
      System.out.println("exception loading properties file");
   }
}

Надеюсь, это поможет вам или кому-либо еще.

4 голосов
/ 01 июня 2011

Введите имя файла, используя контекстный параметр или системный параметр java.

1.Context Param

<context-param>
<param-name>daofilename</param-name>
<param-value>D:\daofilename.props</param-value>
</context-param>

2.Системный параметр

java -Ddao.filename=D:\daofilename.props server
2 голосов
/ 01 июня 2011

В зависимости от вашего веб-сервера, вы можете разместить файл свойств в каком-либо месте, которое включено в classpath. Например, для некоторых версий tomcat это будет ${TOMCAT_BASE}/shared/classes. Веб-приложение может затем использовать что-то вроде следующего, чтобы прочитать файл и автоматически найти его в этом месте.

ServletContext context = getServletContext();
InputStream is = context.getResourceAsStream("yourfilename.cnf");

Вы также можете указать имя файла после имени, установленного в вашем веб-приложении, и использовать это имя в своем коде при загрузке файла из classpath. Таким образом, вы можете иметь файлы свойств для нескольких веб-приложений в общем каталоге, не конфликтуя друг с другом.

Вы указали, что у вас нет доступа к ServletContext, потому что вы хотите, чтобы код был в служебном классе. Один из способов обойти это ограничение - зарегистрировать ServletContextListener, который создает экземпляр средства чтения вашего файла свойств (поскольку он имеет доступ к контексту) и регистрирует его, чтобы его мог использовать другой код. Примерно так:

public class MyServletContextListener extends ServletContextListener{
    public void contextInitialized(ServletContextEvent event){
        ServletContext context = event.getServletContext();
        context.setAttribute("settings", new MyPropertyReader(context));
    }

    public void contextDestroyed(ServletContextEvent event){}
    }

}
0 голосов
/ 01 июня 2011

Подход, который я обычно применяю, заключается в том, что программа предполагает, что файл конфигурации находится в %user.home%/.program/config.properties.

Если файл не найден (обычно при первом запуске), копия создается изпуть к классу файла конфигурации по умолчанию и помещен туда.

Для большей гибкости это обычно можно переопределить, используя -Dconfig = somepath.

0 голосов
/ 01 июня 2011

Если вы используете Tomcat, вы можете добавить любые свойства, которые вам нравятся, в контекст, посмотрите документацию для context.xml .Все серверы приложений имеют свой собственный способ сделать это, поэтому вам придется поискать примеры таких действий в JBoss, Glassfish и т. Д.* JNDI ресурсы .

0 голосов
/ 01 июня 2011

Вы должны указать местоположение файла свойств как свойство времени выполнения Java для вашего веб-контейнера.

Например, java -DmypropertyFile.location=c:/propertyfile.properties -jar yourContainer.jar

...