先上结论
启动 jar 时所在的目录
将会成为相对路径
的基准路径
例如:
# 移动到根目录
cd /
# 启动app.jar
$ java -jar /mydir/app.jar
# 此时在springboot项目中读取相对目录则会按照根目录('/')作为基准路径进行查找
我的过程
初试在Linux下部署Springboot jar
根据Springboot读取配置文件的规则
1.在jar包的同一目录下建一个config文件夹,然后把配置文件放到这个文件夹下。 2.直接把配置文件放到jar包的同级目录。 3.在classpath下建一个config文件夹,然后把配置文件放进去。 4.在classpath下直接放配置文件。
我的步骤:
- 在/mydir/app.jar目录下放置了
application.yml
文件方便进行配置修改 - 移动到app.jar目录,并启动
结果:cd /mydir $ java -jar app.jar
application.yml
文件被成功读取./mydir/logs
目录生成日志文件 (我配置了日志存放到./logs
)
进行linux systemd
服务配置
参照 Springboot 官方文档 Installation as a systemd Service
编写 service文件
myapp.service
[Unit]
Description=myapp
After=syslog.target
[Service]
User=myapp
ExecStart=/mydir/myapp.jar #使用了绝对路径
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
并拷贝到 /etc/systemd/system
目录
# 通过服务启动Springboot
$ systemctl enable myapp.service
但是却没能读取到/mydir/application.yml
配置文件
但是在/logs
目录生成了日志文件
这不对啊,经过一番Google,
启动 jar 时所在的目录
将会成为相对路径
的基准路径
于是默默地把/mydir/application.yml
移动到了 /application.yml
结果当然是成功启动,最后当然是...手动指定配置文件稳定咯
myapp.service
[Unit]
Description=myapp
After=syslog.target
[Service]
User=myapp
ExecStart=/mydir/myapp.jar --spring.config.local=/mydir/application.yml #指定配置文件
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
分析总结
1.长期使用外部Tomcat
作为web容器,启动war项目时,Tomcat会以项目目录启动,所以相对路径指向的是项目目录.
2.惯性思维认为相对目录就是以app.jar为基准目录进行查找文件
3.重新认识了相对路径
与工作目录
注意:"手动指定Springboot配置文件,不会按照配置文件加载顺序依次覆盖,而是只会读取指定的配置文件
后续采用Docker进行部署,也要进行相对路径的确定
使用 WORKDIR 进行工作目录指定
Dockerfile
FROM openjdk:8-jdk-alpine
//do something
WORKDIR /mydir #命令会在这个目录执行,相对路径也就会以它作为基准
ENTRYPOINT ["java","-jar","/mydir/app.jar","--spring.profiles.active=prod"]