Webserver无法读取本地可以读取的druid.properties

Webserver无法读取本地可以读取的druid.properties

问题

笔者最近正在学习 JavaWeb,在 IDEA 中部署了本地 Tomcat8,jdk 为1.8版本。

在 JDBC 中使用 Druid 数据库连接池的代码复制过来使用:

package com.onequiz.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

public class ConnectionPoolUtils {
    private static DataSource source;

    static {
        InputStream is = null;
        try {
            Properties pros = new Properties();
            is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
            //NullPointerException
            pros.load(is);
            source = DruidDataSourceFactory.createDataSource(pros);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                assert is != null;
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public static Connection getConnection() throws SQLException {
        return source.getConnection();
    }
}

然而这段本地测试并未报错的代码,部署到 Tomcat 并运行后就在读取 druid.properties 后并 load 时抛出了 NullPointerException

image

解决方法

ClassLoader.getSystemClassLoader().getResource(...) 替换为ConnectionPoolUtils.class.getClassLoader().getResource(...)

因为在网络服务器中有多个类加载器,我们不能确定是哪个加载了这个类。可能 ClassLoader 类在使用默认 java 类加载器之前就已经被加载,然后 ConnectionPoolUtils 类使用 webserver 加载了不同的类加载器,因此它导致了不同的类路径,所以无法读取配置文件。

参考

解决方法来源

posted @ 2022-09-07 10:53  oneQuiz  阅读(61)  评论(0)    收藏  举报