tomcat 5.5 - проблема с чтением файлов ресурсов - PullRequest
8 голосов
/ 18 ноября 2008

Я использую Tomcat 5.5 в качестве контейнера для сервлетов. Мое веб-приложение развертывается через .jar и содержит некоторые файлы ресурсов (текстовые файлы со строками и параметрами конфигурации), расположенные в каталоге WEB-INF. Tomcat 5.5 работает на Ubuntu Linux. Файл ресурса читается с помощью программы чтения файлов:
fr = new FileReader("messages.properties");

Проблема в том, что иногда сервлет не может найти файл ресурсов, но если я перезагружаю его пару раз, он работает, затем снова через некоторое время он перестает работать. Может кто-нибудь подсказать, как лучше всего читать строки ресурсов из сервлета? Или обойти эту проблему? Помещение файлов ресурсов в WEB-INF / classes тоже не помогает.

Ответы [ 5 ]

9 голосов
/ 20 ноября 2008

Если вы пытаетесь получить доступ к этому файлу из класса, поддерживающего сервлет, такого как ContextListener или другой прослушиватель жизненного цикла, вы можете использовать объект ServletContext для получения пути к ресурсу.

Эти три примерно эквивалентны. (Не путайте метод getResourceAsStream с тем, который используется классом ClassLoader. Они ведут себя по-разному)

void myFunc(ServletContext context) {
   //returns full path. Ex: C:\tomcat\5.5\webapps\myapp\web-inf\message.properties 
   String fullCanonicalPath = context.getRealPath("/WEB-INF/message.properties");

   //Returns a URL to the file. Ex: file://c:/tomcat..../message.properties
   URL urlToFile = context.getResource("/WEB-INF/message.properties");

   //Returns an input stream. Like calling getResource().openStream();
   InputStream inputStream = context.getResourceAsStream("/WEB-INF/message.properties");
   //do something
}
5 голосов
/ 18 ноября 2008

Полагаю, проблема в том, что вы пытаетесь использовать относительный путь для доступа к файлу. Использование абсолютного пути должно помочь (т.е. "/home/tomcat5/properties/messages.properties").

Однако обычным решением этой проблемы является использование метода getResourceAsStream класса ClassLoader. Развертывание файла свойств в «WEB-INF / classes» сделает его доступным для загрузчика классов, и вы сможете получить доступ к потоку свойств.

Непроверенный протокод:

Properties props = new Properties();

InputStream is =
getClass().getClassLoader().getResourceAsStream("messages.properties");

props.load(is);
2 голосов
/ 03 июля 2009

Я использую следующий код для загрузки файла свойств из сервлета:

public void init(ServletConfig config) throws ServletException {
    String pathToFile = config.getServletContext().getRealPath("")
        + "/WEB-INF/config.properties";
    Properties properties = new Properties();
    properties.load(new FileInputStream(pathToPropertiesFile));
}

Это работает с Tomcat 6.0

2 голосов
/ 18 ноября 2008

Если вы используете

new FileReader("message.properties");

Затем FileReader попытается прочитать этот файл из базового каталога, который в Tomcat, вероятно, будет папкой / bin.

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

0 голосов
/ 11 ноября 2009

Я использовал для Jboss Seam:

ServletLifecycle.getServletContext().getRealPath("")

...