无法使 getResourceAsStream() 加载 .properties 资源 - 使用 Netbeans IDE

Unable to make getResourceAsStream() to load the .properties resource - using Netbeans IDE

首先,对于在本论坛中提出一个经常重复的问题,我深表歉意;但我想不出我的错误。

我有两个 .properties 文件试图加载失败。这是我的文件夹结构 - 除非有令人信服的理由或违反最佳实践,否则我喜欢保留这种结构:

如您所见,我的 DAO 代码在 zencs.dbutils 包下,我的 .properties 文件分别在 zencs.resources.properties.db* 包下。

我之所以这样做,是因为最终这将连接到并管理多个数据源——我的 DAO 代码将发展为动态处理它们(目前还不是)。我想在一个地方设置所有数据源属性

我的Project属性设置如下:

现在在我的 DAO class 中,我有一个方法 initProperties(),由 getConnection() 调用,它试图通过 getResourceAsStream() 引用这些属性文件。请看下面我试过的代码:

public class DAO {
Connection conn = null;

public Properties properties = new Properties();
public Properties dbConnect = new Properties();

private void initProperties()  {
    InputStream inputDBdrivers = getClass().getResourceAsStream("snowflakeConnect.properties");
    if (inputDBdrivers != null) {
        try{
            dbConnect.load(inputDBdrivers);
            inputDBdrivers.close();
        } catch(IOException ioex) {
            System.err.println(ioex.getStackTrace().toString());
        }
    } else {
        System.out.println("snowflakeConnect.properties file not found! Terminating Application normally...");
        System.exit(0);
    }
    InputStream inputDBprops = getClass().getResourceAsStream("snowflake.properties");
    if (inputDBprops != null) {
        try{
            properties.load(inputDBprops);
            inputDBprops.close();
        } catch(IOException ioex) {
            System.err.println(ioex.getStackTrace().toString());
        }
    } else {
        System.out.println("snowflake.properties file not found! Terminating Application normally...");
        System.exit(0);
    }
}

Connection getConnection() throws SQLException {
    // build connection properties
    initProperties();
    try {
        Class.forName(dbConnect.getProperty("driver"));
    } catch (ClassNotFoundException cnfex) {
        System.err.println("ERROR: getConnection() :: Snowflake Class not found: " + cnfex.getMessage());
    }

    return DriverManager.getConnection(dbConnect.getProperty("connectStr"), properties);
}

public DAO() {
    try {
      this.conn = getConnection();
    } catch (SQLException sqlex) {
      Logger.getLogger(DAO.class.getName()).log(Level.SEVERE, null, sqlex);
    }
}

}

当我执行它时,错误显示 "snowflakeConnect.properties file not found! Terminating Application normally..."

我的评价是,上面表格中的代码将文件解析到 zencs/dbutils/ 中,而 ClassLoader 显然无法在那里找到它们。

我尝试了完整的绝对路径(虽然它期望相对路径,但出于绝望);我尝试使用“../resources/properties/{dbdrivers | dbutils}/filename.properties”的相对路径但没有成功。使用相对路径,它解析为 "zencs/dbutils/../resources/properties/dbdrivers/snowflakeConnect.properties" for ClassLoader...

我没有正确设置资源文件夹及其下的所有内容吗?

显然我对它应该如何解决的理解是有缺陷的。能否请您帮助解决我可能不理解的问题以及我应该如何解决这个问题?

非常感谢!

您可以尝试使用 getResourceAsStream() 包括您的包名称,如下所示:

InputStream inputDBdrivers = getClass().getResourceAsStream("/zencs/resources/properties/dbdrivers/snowflakeConnect.properties");
InputStream inputDBprops = getClass().getResourceAsStream("/zencs/resources/properties/dbutils/snowflake.properties");

前导斜线通常是此处的关键部分。它也可以帮助删除它,但你说你已经尝试过,所以我想这不是你要找的。