在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中使用
大家按需設置,或者做兩套環境