还是今天那个从服务器拉取的项目在本地部署产生的问题,光是在本地部署运行就让我弥补了自己三个知识点的不足,这个项目属实了不得。
在此之前,我一直以为spring boot项目通过package方式打包成jar包然后就可以放在服务器上部署运行了。事实上正常情况下也是可以运行成功的。
不过我这个项目当时放在一个文件夹下面里面还有其他几个配置文件与文件夹与jar包同级,我当时直接把这个文件夹拉下来了,直接在这个文件夹下运行这个jar包。
修改完jar包中的配置文件主要是MySQL的配置,解决了其他的问题后一运行给我报了个数据库密码错误,我又反复检查了几遍jar包中我的MySQL密码,发现没有错,又看到jar包的同级也有个MySQL的配置文件,感觉奇奇怪怪的,就死马当活马医修改了该文件的配置,一运行结果成了!
不信邪的我又将jar包单独放在一个空文件夹下运行,报错:没有gson的配置。
由此,引出我的一个疑问,jar包外的配置文件可以影响jar包运行吗?答案是肯定的。
项目以最常规的方式打包成一个整体的jar包部署,即配置文件和第三方依赖包都包含在jar包里,就会有如下两个问题:
问题一:项目运行过程中,要改动配置文件的话需要重新打包并部署。
问题二:多个第三方依赖包都相近的项目要部署在同一台服务器时,各自的jar包都包含了相同的第三方依赖包(假设项目jar包有100M,第三方依赖包可能就占用了99M),这样第三方依赖包冗余造成了服务器资源的浪费以及降低了项目部署的效率。
因此将各项目的配置文件、第三方依赖包都提取到jar包外统一管理,这样即提升了项目打包效率又节约了服务器的磁盘消耗,同时项目的运维也是非常方便的,改动了配置文件重启下服务就可以了,无需重新构建部署。
Springboot中处理是对于读取核心配置文件(application.properties)设置优先级:
Jar包同级目录的config目录
Jar包同级目录
classPath(即resources目录)的config目录
classpath目录
上面是springboot默认去拿自己的核心配置文件的优先级,还有一种最高优先级的方式是项目启动时通过命令的方式指定项目加载核心配置文件,命令如下
java –jar -Dspring.config.location=xxx/xxx/xxxx.properties xxxx.jar
如果Spring Boot在优先级更高的位置找到了配置,那么它会无视优先级更低的配置
这就是为什么我只修改了jar包中的MySQL配置不起作用,是因为jar包的同级目录下也有一个相同的配置文件,spring boot优先读取的是jar包同级目录下的配置文件。
对于其他配置文件在jar包外如何生效的操作可以参考下面这篇文章:
https://blog.csdn.net/xrq0508/article/details/80050119