在application.yml/properties中配置Spring Boot工作目录,配置动态变量
当我们想配置上传文件的路径时,如果不想写绝对路径,那么就可以配置动态变量
以yaml为例
方法一
使用user.dir
,代码如下:
sub-file-path-win: \upload\
sub-file-path-unix: /upload/
file-path: ${user.dir}#{'${os.name}'.indexOf('Windows')>-1?'${sub-file-path-win}':'${sub-file-path-unix}'}
注意:user.dir
为工作目录,即运行项目时所在的目录,并不是jar包所在的目录
比如,在idea中运行,user.dir
是项目路径
当打成jar后,如果运行
[root@localhost ~]# java -jar ./test-0.0.1-SNAPSHOT.jar
那么结果是/root
如果运行
[root@localhost ~]# java -jar /home/springboot/test-0.0.1-SNAPSHOT.jar
那么结果仍是/root
,因为运行java时的目录是~
方法二
使用ApplicationHome,代码如下:
sub-file-path-win: \upload\
sub-file-path-unix: /upload/
file-path: "#{(new org.springframework.boot.system.ApplicationHome(getClass())).getSource().getParentFile().toString()}#{'${os.name}'.indexOf('Windows')>-1?'${sub-file-path-win}':'${sub-file-path-unix}'}"
Java代码是:
(new org.springframework.boot.system.ApplicationHome(getClass())).getSource().getParentFile().toString()
这是真正的jar包路径,和运行命令时的路径无关
缺点一是在IDEA中运行springboot项目时,结果并不是项目路径,而是tomcat运行的地方:
C:\Users\UsersName\.m2\repository\org\springframework\spring-beans\5.3.18
二是ApplicationHome只能在springboot java代码中使用,而不能在单元测试test中使用
大家按需设置,或者做两套环境