2016-12-05 12 views
1

У меня есть простое веб-приложение, которое использует Apache Tomcat 6.0. Я пытаюсь прочитать файл свойств из пути «resources/mysql.properties». Здесь папка «resources» находится за пределами папки «src». Когда я пытаюсь запустить проект как приложение Java, он отлично работает. Но он запускает FileNotFoundException, когда я запускаю его на сервере.FileNotFound Exception во время работы на Apache Tomcat?

Это код Java с основным, который я запускаю на консоли.

package com.jm.test; 

import com.jm.util.PropertyUtil; 

public class CodeTester { 

    public static void main(String[] args) { 
      System.out.println(PropertyUtil.getDBPropertyValue("driver")); 
    } 

} 

Это код файла PropertyUtil.Java.

/** 
    * 
    */ 
    package com.jm.util; 

    import java.io.File; 
    import java.io.FileInputStream; 
    import java.io.FileNotFoundException; 
    import java.io.IOException; 
    import java.io.InputStream; 
    import java.util.MissingResourceException; 
    import java.util.Properties; 

    import org.apache.log4j.Logger; 

    /** 
    * @author Jaydeep Ranipa 
    * 
    */ 
    public class PropertyUtil { 
     public static final Logger log = Logger.getLogger(PropertyUtil.class); 
     private static final String resourceDir = "resources"; 

     private PropertyUtil() { 
     } 

     private static Properties loadProperties(String fileName) throws IOException, FileNotFoundException { 
      System.out.println("filename: "+fileName); 
      InputStream fileStream = new FileInputStream(new File(fileName)); 
      Properties props = new Properties(); 
      props.load(fileStream); 
      return props; 
     } 

     public static String getDBPropertyValue(String key) { 
      Properties prop = null; 
      String value = ""; 
      String fileName = "localmysql.properties"; 

      try { 
       prop = loadProperties(resourceDir + "/" + fileName); 
       value = prop.getProperty(key); 
       if (value == null) { 
        throw new MissingResourceException("Property not found.", "DATABASE", key); 
       } 
      } catch (FileNotFoundException e) { 
       // TODO Auto-generated catch block 
       System.out.println("properties file not found"); 
       e.printStackTrace(); 
       log.error("Properties file <<<"+resourceDir + "/" + fileName +">>> not found."); 
       value = "Error occured."; 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       System.out.println("properties file reading failed"); 
     log.error("Properties file <<<"+resourceDir + "/" + fileName +">>> reading failed."); 
       value = "Error occured."; 
      } catch (MissingResourceException e) { 
       // TODO: handle exception 
       System.out.println("property not found"); 
       log.error("Property <<<"+e.getKey()+">>> for <<<"+e.getClassName()+">>> not found."); 
       value = "Error occured."; 
      } 
      return value; 
     } 

     public static String getErrorMessage(String errorCode) { 
      Properties prop = null; 
      String message = ""; 
      String fileName = "errormessage.properties"; 

      try { 
       prop = loadProperties(resourceDir + "/" + fileName); 
       message = prop.getProperty(errorCode); 
       if (message == null) { 
        throw new MissingResourceException("Property not found.", "ERROR", errorCode) 
       } 
      } catch (FileNotFoundException e) 
       // TODO Auto-generated catch block 
       log.error("Properties file <<<"+resourceDir + "/" + fileName +">>> not found.") 
       message = "Something went wrong."; 
      } catch (IOException e) { 
       // TODO Auto-generated catch bloc 
       log.error("Properties file <<<"+resourceDir + "/" + fileName +">>> reading failed."); 
       message = "Something went wrong."; 
      } catch (MissingResourceException e) { 
       // TODO: handle exception 
       log.error("Property <<<"+e.getKey()+">>> for <<<"+e.getClassName()+">>> not found."); 
       message = "Something went wrong."; 
      } 
      return message 
     } 
    } 

Следующий код дает ошибку при выполнении через веб-сервер.

Class.forName(PropertyUtil.getDBPropertyValue("driver")); 
    con = DriverManager.getConnection(PropertyUtil.getDBPropertyValue("url"), 
    PropertyUtil.getDBPropertyValue("username"), 
    PropertyUtil.getDBPropertyValue("password")); 
    return con; 

Вот структура проекта. Project Structure

+0

Вы должны загружать свои объекты с помощью [Class.getResourceAsStream] (http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getResourceAsStream-java.lang.String-). Запись в .jar или .war не является фактическим файлом, поэтому вы не можете загрузить его с помощью FileInputStream. – VGR

+0

попробуйте вызвать имя файла непосредственно без resourceDir и посмотреть, поможет ли это. Вы также можете попробовать выйти из косой черты и попробовать. – yogidilip

ответ

1

How to find the working folder of a servlet based application in order to load resources

Заканчивать эту тему и вместо:

InputStream fileStream = new FileInputStream(new File(fileName)); 

попробовать:

InputStream fileStream = getServletContext().getResourceAsStream(fileName); 
+0

Как получить абсолютный путь для всех файлов свойств, перечисленных выше в папке ресурсов? Я хочу получить доступ к ним в консоли, а также в веб-приложении. –

0

В TOMCAT подкаталог "/ Lib" добавить driverDB.

+0

Это может сработать, но не очень хороший совет. Каталог 'bin' Tomcat не следует использовать для ресурсов приложения. – ujulu