2016-12-05 137 views
1

我有一个使用Apache Tomcat 6.0的简单Web应用程序。我正在尝试从路径“resources/mysql.properties”中读取属性文件。这里的“resources”文件夹位于“src”文件夹之外。当我试图运行该项目作为Java应用程序,它工作正常。但是当我在服务器上运行它时会引发FileNotFoundException。在Apache Tomcat上运行时发生FileNotFound异常?

这是带有main的Java代码,我在Console上运行它。

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,看看是否有帮助。您也可以尝试转义斜线并尝试。 – yogidilip

回答

0

在Tomcat的子目录 “/ lib目录” 添加driverDB。

+0

这可能会起作用,但不是一个好建议。不应将Tomcat的'bin'目录用于应用程序特定的资源。 – ujulu