我用的是intelij idea,准备做个网站。结果在测试一个从数据库拿数据的servlet时报错
java.lang.NoClassDefFoundError: Could not initialize class com.utils.JDBCutils
发现在Dao的实现类中添加main主程序可以运行,但是开启tomcat后无法初始化工具类com.utils.JDBCutils。
其中配置文件放在resource下,从上到下看了看代码也没有什么错的地方。
工具类代码:
package com.utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
public class JDBCutils {
//静态jdbc参数
private static DataSource ds;
static{
//读取资源文件,获取jdbc相关值
try {
Properties pro = new Properties();
//加载配置文件
pro.load(JDBCutils.class.getClassLoader().getResourceAsStream("druid.properties"));
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
//获取连接@return连接对象
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
//释放资源
// @param stmt
// @param conn
public static void close(Statement stmt,Connection conn){
close(null,stmt,conn);
}
//释放资源
// @param rs
// @param stmt
// @param conn
public static void close(ResultSet rs,Statement stmt,Connection conn){
if(rs != null){
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
//获取链接池方法
public static DataSource getDataSoucrce(){
return ds;
}
}
现在就是不知道这个报错到底咋回事,明明工具类在实现类中可以初始化,为啥在启动web项目时报错了.....
配置文件:
#驱动加载 driverClassName=com.mysql.cj.jdbc.Driver #注册驱动 url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&serverTimezone=UTC #连接数据库的用户名 username=root #连接数据库的密码 password=12345678 #属性类型的字符串,通过别名的方式配置扩展插件, 监控统计用的stat 日志用log4j 防御sql注入:wall filters=stat #初始化时池中建立的物理连接个数。 initialSize=2 #最大的可活跃的连接池数量 maxActive=300 #获取连接时最大等待时间,单位毫秒,超过连接就会失效。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降, 如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 maxWait=60000 #连接回收器的运行周期时间,时间到了清理池中空闲的连接,testWhileIdle根据这个判断 timeBetweenEvictionRunsMillis=60000 minEvictableIdleTimeMillis=300000 #用来检测连接是否有效的sql,要求是一个查询语句。 validationQuery=SELECT 1 #建议配置为true,不影响性能,并且保证安全性。 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis, 执行validationQuery检测连接是否有效。 testWhileIdle=true #申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。设置为false testOnBorrow=false #归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能,设置为flase testOnReturn=false #是否缓存preparedStatement,也就是PSCache。 poolPreparedStatements=false #池中能够缓冲的preparedStatements语句数量 maxPoolPreparedStatementPerConnectionSize=200
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。
因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。
楼主你弄明白了吗?我也遇到了 我发现把配置文件路径改为绝对路径就可以 但是不知道为什么相对路径就一定报错