2016-12-05 11 views
1

私はApache Tomcat 6.0を使用する単純なWebアプリケーションを持っています。私はパス "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 
     } 
    } 

次のコードは、Webサーバー経由で実行するときのエラーを示しています。

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)); 

試し:Tomcatのサブディレクトリで

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

上記のリソースフォルダにあるすべてのプロパティファイルの絶対パスを取得するにはどうすればよいですか?私はコンソールとWebアプリケーションでそれらにアクセスしたいです。 –

0

"/ libに" driverDBを追加します。

+0

これはうまくいくかもしれませんが、良いアドバイスではありません。 Tomcatの 'bin'ディレクトリは、アプリケーション固有のリソースには使用しないでください。 – ujulu

関連する問題