maven编译后启动jar包读取不了启动时的配置文件
在周一的时候,我给大家介绍过,有个项目是前后端分离的,前端是npm编译后的nginx静态目录,后端是maven编译后的jar包。
话说线上有个客户体验环境,但是由于一些原因,不能再在这个线上客户体验环境进行测试、动里面的数据了,鉴于线上服务器也不太充足,所以这几天临时需要在公司内网部署一个客户体验环境。
昨天我经理叫我快速部署好这个环境(我当时给他说如果不急的话,天翼云近期会给测试服务器我们,在上面部署,但他说比较急,我只能从了),因为明天要去做演示。然后本来内网是有一个内测环境(架构一摸一样,有nginx也有配好的配置文件,也有java环境),跟线上测试环境一样的,弄了jenkins发布。
昨天在公司内网部署这个环境,我是怎么快速完成的呢?
一开始,我想直接克隆该机器的,新建一个新的虚拟机,但想想这样也慢了,因为内网内测环境也分配了100G的硬盘,vmx、vmdk后缀文件大小都不小。可以参考我之前的【同一台服务器虚拟机之间克隆参考:https://blog.csdn.net/zhangmingcai/article/details/87859339】
于是这种方案被我摒弃,果断在这台原内测环境的机器部署。nginx静态目录指向另一个位置,而jar包运行改成另一个端口。
(1)同步线上客户体验环境的数据库数据到公司内网数据库
mysqldump线上mysql数据库数据下来,导入到内网mysql
(2)对于前端nginx
jenkins 配置发布流程:npm编译之后(npm install;npm run build:xxx),会生成一个dist目录,然后我会将它压缩打包成 dist.tar.gz,再远程发布到nginx入口机器,解压。
可以直接从浏览器jenkins的工作区拿到,双击下载,然后在内网服务器 rz 上传即可:
(3)对于后端 jar 包
jenkins 配置发布流程:maven编译后(clean install -e -DskipTests=true -Pxxx),会在某个项目目录下生成jar包,然后发布到远程机器,java -jar xxx.jar。
同理也是从浏览器下载拿到。
由于maven编译的时候,连的是线上体验环境的数据库,所以启动的时候,我特意指定了修改过的配置文件(连接公司内网数据库)去运行:
nohup /usr/local/java/jdk1.8/bin/java -jar {系统后台jar包名}.jar --spring.config.location=application-xxx.properties --server.port={指定一个服务器上没有监听过的端口,尤其不要跟测试环境的jar包端口一样} >> /home/{服务器某普通用户}/app/{项目名}/logs/out_{项目名}.log 2>&1
这个application-xxx.properties 是我从浏览器下载的jar包解压出来的目录:BOOT-INF/classes/ 拿到的。
然后在里面我修改成内网数据库连接:
今天很悲催的发现,即使我强制指定改过的数据库配置连接文件,还是连的线上,只能感叹这个jar包很顽固。也推翻我之前测的 启动jar包指定数据库连接 的实验,如果今天不是前端叫我停内网数据库,去验证这个问题,我还真的以为很正常的连接到了内网的数据库。
至于为啥这样,我都觉得是个谜~~~我那个实验确实可以的,但今天这个环境又不可以。
另外一个事,前端直接拷贝dist目录来还原线上体验环境也是不行的!!
npm有个编译:npm run build:xxx,里面已经写死了后台api地址,如下图:
需要改成内网服务器:ip+端口形式的后台地址
所以最终我认为的快速部署环境,实则上是不可行的,都需要重新编译,发布。本来以为走的捷径,实则劳心劳力还解决不了问题,而且以前做的测试也被推翻(原因未知),只能洗洗睡~