【问题标题】:Unable to load .properties in application for Tomcat无法在 Tomcat 的应用程序中加载 .properties
【发布时间】:2011-05-20 14:47:00
【问题描述】:


我需要编写一个连接到数据库并从 .properties 文件中读取连接属性的 Web 应用程序。
我使用 Maven,我想为我的应用程序编写一些单元测试。
为了测试与数据库一起使用的类,我将我的 .properties 文件放到 src/main/resources 和 test/main/resources 中,并编写了以下代码来读取属性:

package util;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import org.apache.log4j.Logger;


/**
 *
 * @author proger
 */
public class ProgrammSettings {

    private static Logger logger = Logger.getRootLogger();
    private static String propertiesPath = "program.settings.properties";

    private static Properties props;

    public static String getProperty(String key) {
        if (props == null)
            loadProperties();

       return props.getProperty(key);

    }

    public static void setResourcesFilePath(String path) {
        propertiesPath = path;
    }

    private static void loadProperties() {
        InputStream propOut = null;
        try {
            //URL url =  ClassLoader.getSystemResource(propertiesPath);
            propOut = ClassLoader.getSystemClassLoader().getResourceAsStream(propertiesPath); //new FileInputStream(url.getFile());
            props = new Properties();
            props.load(propOut);
        } catch (Exception ex) {
            //Logger.getLogger(ProgrammSettings.class.getName()).log(Level.SEVERE, null, ex);
            String errorMessage = "Error during properties file reading. Path to file: '" +
                           propertiesPath + "'";
            logger.error(errorMessage, ex);
            throw new RuntimeException(errorMessage, ex);
        } finally {
            try {
                if (propOut != null)
                    propOut.close();
            } catch (IOException ex) {
                logger.error("Error during closing stream from properties file", ex);
            }
        }
    }
}

我希望相同的代码同时用于测试和应用程序类,所以我从 classPath 读取属性文件。 我所有的测试都通过了,我的 .properties 文件被 Maven 打包进了战争。但是当我从 Netbeans 运行我的应用程序时,我会收到:

java.lang.NullPointerException
    java.util.Properties$LineReader.readLine(Properties.java:435)
    java.util.Properties.load0(Properties.java:354)
    java.util.Properties.load(Properties.java:342)
    util.ProgrammSettings.loadProperties(ProgrammSettings.java:49)
    util.ProgrammSettings.getProperty(ProgrammSettings.java:33)
    dataacess.AbstractDataMapper.loadDriver(AbstractDataMapper.java:58)
    dataacess.AbstractDataMapper.<init>(AbstractDataMapper.java:41)
    dataacess.UserMapper.<init>(UserMapper.java:25)
    servlets.UserRegistration.processRequest(UserRegistration.java:86)
    servlets.UserRegistration.doPost(UserRegistration.java:132)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)

我该如何解决?提前谢谢你

【问题讨论】:

  • 能否在您的问题中编辑您的目录结构
  • 我有 Maven 项目的标准目录结构。

标签: java maven-2 tomcat servlets classpath


【解决方案1】:

program.settings.properties 放入webapps/appname/WEB-INF/classes

您可以使用更简单的行ProgrammSettings.class.getResourceAsStream(..)(即不是系统类加载器,而是当前类加载器)

【讨论】:

  • Maven 在构建过程中将 program.settings.properties 放入 .war。部署和解压后,.properties 文件正是 gin webapps/appname/WEB-INF/classes 所在的位置。但我仍然有同样的错误。
  • 谢谢。 SystemClassLoader 不加载我需要的东西。只有 ProgrammSettings.class ClassLoader 可以做到。
猜你喜欢
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
  • 1970-01-01
相关资源
最近更新 更多