2016-12-05 4 views
1

Apache Tomcat 6.0을 사용하는 간단한 웹 응용 프로그램이 있습니다. "resources/mysql.properties"경로에서 속성 파일을 읽으려고합니다. 여기서 "resources"폴더는 "src"폴더 외부에 있습니다. Java 응용 프로그램으로 프로젝트를 실행하려고하면 잘 작동합니다. 하지만 서버에서 실행할 때 FileNotFoundException이 발생합니다.FileNotFound Apache Tomcat에서 실행되는 동안 예외가 발생 했습니까?

이것은 Console에서 실행되는 main이있는 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없이 filename을 직접 호출하고 도움이되는지 확인하십시오. 슬래시를 벗어나 시도해 볼 수도 있습니다. – 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

"/ lib 디렉토리"를 driverDB를 추가합니다.

+0

이 방법이 효과적 일 수 있지만 좋은 조언은 아닙니다. Tomcat의'bin' 디렉토리는 앱 특정 자원을 위해 사용되어서는 안됩니다. – ujulu