我利用Durid连接池连接数据库时,无法识别properties路径,原因竟然是因为:ClassLoader.getSystemResourceAsStream()方法!!!
以下是错误内容:

最主要的原因就是无法识别properties的路径
当时我是这样写的:

我使用了Java的ClassLoader来加载位于Classpath中的资源文件"servletDemo.properties",并返回一个InputStream对象。而ClassLoader.getSystemResourceAsStream()方法主要用于加载位于Classpath中的资源文件。
什么是Classpath?
Classpath是Java中用于搜索类和资源的路径。它是由一组目录和JAR文件组成的列表。当Java程序执行时,JVM会在类路径下搜索类和资源文件,并加载它们。
在Java中,资源文件是指应用程序使用的非代码文件,例如配置文件、图像、声音文件等。这些文件通常用于存储应用程序的配置信息或提供其他静态数据。
在Classpath中的资源文件指的是相对于Classpath根目录的路径,即资源文件的相对路径。当你将资源文件放在Classpath中的某个目录或JAR文件中时,它们可以被Java程序通过类加载器来访问。
虽然我不知道它识别不了的具体原因,但是换个方式就能解决问题了
解决方式一:利用FileInputStream("绝对路径")的方式找到properties文件
当然也可以用其他类,properties.load()方法中的参数具有Reader、InputStream两种,FileInputStream 是InputStream的子类,所以能够被load使用
public class DruidUtils {
static DataSource dataSource = null;
static {
FileInputStream is = null;
try {
is = new FileInputStream("F:\\develop\\servletLoginNew\\src\\servletDemo.properties");
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
Properties prop = new Properties();
try {
prop.load(is);
} catch (IOException e) {
e.printStackTrace();
}
try {
dataSource = DruidDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
Connection connection = null ;
try {
connection= dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
return connection;
}
}
解决方式二:将properties中的内容写死(也就是写进代码中)
我就不信你这样还找不到
public class NewDruidUtils {
public static Connection getConnection() {
Connection connection = null;
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
// 配置数据库连接信息
dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/servletDemo");
dataSource.setUsername("root");
dataSource.setPassword("root");
try {
dataSource.init();
connection = dataSource.getConnection();
// 使用数据库连接进行操作...
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭数据源
dataSource.close();
}
return connection;
}
}
解决方式三:将ClassLoader.getSystemResourceAsStream()替换成下面的方式,也是可以的
InputStream is = DruidUtils.class.getClassLoader().getResourceAsStream("servletDemo.properties");
若想知道它们的区别请移步:
类名.class.getClassLoader().getResourceAsStream(“.“);和ClassLoader.getSystemResourceAsStream(“.“)的区别!!!
public class DruidUtils{
static DataSource dataSource = null;
static {
InputStream is = DruidUtils.class.getClassLoader().getResourceAsStream("servletDemo.properties");
Properties prop = new Properties();
try {
prop.load(is);
} catch (IOException e) {
e.printStackTrace();
}
try {
dataSource = DruidDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
Connection connection = null ;
try {
connection= dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
return connection;
}
}
若遇到java.lang.NoClassDefFoundError: org/apache/commons/dbutils/ResultSetHandler
可以移步:java.lang.NoClassDefFoundError: org/apache/commons/dbutils/ResultSetHandler(Tomcat浏览器500报错解决方案)
4624

被折叠的 条评论
为什么被折叠?



