Hoody's Blog
Workdir 工作目录

先上结论

启动 jar 时所在的目录 将会成为相对路径基准路径 例如:

# 移动到根目录
cd / 
# 启动app.jar
$ java -jar /mydir/app.jar 
# 此时在springboot项目中读取相对目录则会按照根目录('/')作为基准路径进行查找

我的过程

初试在Linux下部署Springboot jar

根据Springboot读取配置文件的规则
1.在jar包的同一目录下建一个config文件夹,然后把配置文件放到这个文件夹下。 2.直接把配置文件放到jar包的同级目录。 3.在classpath下建一个config文件夹,然后把配置文件放进去。 4.在classpath下直接放配置文件。

我的步骤:

  1. 在/mydir/app.jar目录下放置了application.yml文件方便进行配置修改
  2. 移动到app.jar目录,并启动
    cd /mydir
    $ java -jar app.jar
    结果:
  3. application.yml文件被成功读取.
  4. /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"]
添加新评论,支持Markdown格式