一、问题说明
05-17 10:29:37 .669 lmain ERROR org.springtramework. boot. 1iaanostics .LoggingFailureAnalysisReporter
**************************
APPLICATION FAILED TO START***************************
Description:
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class
Action:
Consider the following:
If you want an embedded database (H2,HSQL or Derby), please put it on the classpath.
If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).
这里是spring boot连接数据库,在启动项目时的报错。
这种报错在创建一个新的项目时,填写完配置,在本地启动项目时,很常见的报错。
此问题告知我们,项目启动连接数据库时,找不到配置连接。我们普通的排查是,步骤是查看配置是否书写规范,在查看数据库驱动是否引入。新项目创建一般都是这两个问题引起。
对于这个问题网上还有一种存在的问题,就是spring boot项目没有自动加载到application.yml,那么我们在启动类上添加这个注解就可以了
@SpringBootApplication(exclude={DataSourceAutoConfiguration.calss})
DataSourceAutoConfiguration.class会自动查找application.yml或者properties文件里的spring.datasource.*相关属性并自动配置单数据源
但这次需要说明的问题,却不是以上问题引起的。下面我做个一个简要的说明。
事情是老项目部署新环境中且需要更换就数据库,由原来的的MySQL替换为国产瀚高数据库,我处理的方式是将驱动替换掉,在对配置中的url和driver-class-name进行替换就可以了。除此外我将原来的nacos-config做了去除,因为这是项目的配置基本不会改变,所以做了操作。
这些动作都作完后,在本地启动运行没有任何问题,但一部署到线上环境,就报上面错误。起初还以为是数据库安装问题,找了半天没发现原因,版本也是做了更新还是存在这个问题。
最后发现是启动脚本的问题,之前脚本是针对是nacos-config配置启动脚本。脚本中指定需要nacos-config配置所以出现上面报错,因为我们线上环境没有安装nacos。所以就获取不到配置,导致上面报错。
更改启动脚本就可以了。折腾了一天,好在找到了问题,并顺利启动。
加载nacos-config配置启动项目的.sh脚本
#!/bin/sh
java_option="-Xverify:none -XX:+UseParallelGC -Xms512M -Xmx512M"
for filename in *;
do
if [ "${filename##*.}" = "jar" ]
then
JAR_NAME=$filename
fi
done
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq "0" ]; then
echo "${JAR_NAME}已经启动, PID=${pid}"
else
nohup java -server $java_option -jar $JAR_NAME --spring.profiles.active=zdds-test >> server.log &
PID=$(echo $!)
echo "${JAR_NAME}启动成功,PID=$!"
fi
}
#停止方法
stop(){
PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
if [ -n "$PID" ];then
echo "$JAR_NAME:准备结束,PID=$PID"
kill -9 $PID
PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
while [ -n "$PID" ]
do
PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
done
echo "$JAR_NAME:成功结束"
else
echo "$JAR_NAME:未运行"
fi
}
status(){
PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
if [ -n "$PID" ];then
echo "$JAR_NAME:正在运行,PID=$PID"
else
echo "$JAR_NAME:未运行"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
*)
echo "请输入:start|stop|restart|status"
exit 1
;;
esac
加载项目配置启动.sh脚本
#!/bin/sh
java_option="-Xverify:none -XX:+UseParallelGC -Xms512M -Xmx512M"
for filename in *;
do
if [ "${filename##*.}" = "jar" ]
then
JAR_NAME=$filename
fi
done
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq "0" ]; then
echo "${JAR_NAME}已经启动, PID=${pid}"
else
nohup java -server $java_option -jar $JAR_NAME >> server.log &
PID=$(echo $!)
echo "${JAR_NAME}启动成功,PID=$!"
fi
}
#停止方法
stop(){
PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
if [ -n "$PID" ];then
echo "$JAR_NAME:准备结束,PID=$PID"
kill -9 $PID
PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
while [ -n "$PID" ]
do
PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
done
echo "$JAR_NAME:成功结束"
else
echo "$JAR_NAME:未运行"
fi
}
status(){
PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
if [ -n "$PID" ];then
echo "$JAR_NAME:正在运行,PID=$PID"
else
echo "$JAR_NAME:未运行"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
*)
echo "请输入:start|stop|restart|status"
exit 1
;;
esac
在开发中遇到问题,可以加本人微信进行交流: