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 :

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

浙公网安备 33010602011771号