先说结论
这篇文章适用的情况:jar包内已打包配置文件,但是还想调用外部配置文件
1用到的核心命令
jar包运行外部配置文件的命令如下
java -jar -Dspring.config.location=myApplication.properties,classpath:application.properties, ./cm-api-2.0.0.jar> cmv3.out 2>&1 &
其中,myApplication.properties是和jar包在同一目录下的外部配置文件,application.properties是jar包内部配置文件
这个命令就是最终测试可以让jar包成功调用外部配置文件,而且最重要一点!需要 打包前注释掉内部application.properties配置文件,外部的才可以生效,我看的教程都是执行外部配置文件的优先级要高于内部,(这点可以查找下springboot调用配置文件的优先级资料)但是,我遇到的问题就是指定了外部配置文件最终运行还是调用的内部配置文件。原因何在?项目上限忙于先解决部署,原因没有时间细究。
2 尝试过的命令
java -jar xxx.jar --spring.profiles.active=test
这个命令可以启动名为test的外部配置文件,可以看到springboot启动日志里确实显示了当前的启动配置文件为test。但是!但是!但是!项目开始跑起来后还是调用了我jar包内部的配置文件。最后更换了1.1中的命令才成功。
3 启动脚本编写
#!/bin/sh
port=8888 #定义变量等号左右不能有空格
jar_name=cm-api-2.0.0.jar
#运行脚本提示信息
tips(){
echo "-------------------------------------"
echo ""
echo "项目端口: ${port}"
echo "jar包: ${jar_name}"
echo ""
echo "你可以使用如下参数进行操作"
echo ""
echo "-status -查看运行日志"
echo "-start -启动当前项目"
echo "-stop -停止当前项目"
echo "-restart -重启当前项目"
echo ""
echo "-可在文件application-dev中修改数据库配置"
echo "-------------------------------------"
}
#查看状态
status(){
#查询日志
tail -100f ./cmv3.out
}
#启动项目
start(){
pid=`netstat -apn |grep $port |awk '{print $7}' |cut -d/ -f 1`
if [ -z "${pid}" ];then
echo "正在启动......"
java -jar -Dspring.config.location=myApplication.properties,classpath:application.properties, ./cm-api-2.0.0.jar> cmv3.out 2>&1 &
else
echo "项目运行中或端口已被占用"
fi
}
#停止项目
stop(){
pid=`netstat -apn |grep $port |awk '{print $7}' |cut -d/ -f 1`
if [ -z "${pid}" ];then
echo "没有项目在运行,请先启动"
else
kill -9 $pid
echo "已杀死端口为 ${port} 的应用"
fi
}
#重启项目
restart(){
pid=`netstat -apn |grep $port |awk '{print $7}' |cut -d/ -f 1`
echo "正在杀死端口 ${port} 的pid ${pid} 中..."
if [ -z "${pid}" ];then
echo "项目未启动"
else
kill -9 $pid
fi
sleep 5 #睡眠五秒
start #调用启动方法
echo "项目重启成功!"
}
#参数选项
case "$1" in
"-status")
status
;;
"-start")
start
;;
"-stop")
stop
;;
"-restart")
restart
;;
*)
tips
;;
esac