#平常啟動springboot的jar包,都是透過–spring.profiles.active=dev, 即可讀取application-dev.yml的設定檔的資訊,進行啟動
這次啟動就很奇怪了, 輸入這個啟動環境參數, 依然不起效果,
就是這麼驚悚, 就是這麼意外!
沒有讀取application-dev.yml而是讀取預設的application.yml檔案
#但是, 使用jvm的啟動參數: java -jar -Dspring.profiles.active=dev, 可以啟動, 證明dev的設定檔是有效的
application的入口類別發現:
public static void main(String[] args){ SpringApplication.run(Application.class,args); }
呼叫run方法的時候, 沒有傳入args!
閱讀原始碼發現, 傳入啟動參數, 再解析傳入參數,對properties進行設定
#注意:
細心細心, 啟動程式碼需要傳入啟動參數!!! 方能在啟動時,輸入啟動參數生效
SpringBoot允許我們有多個設定文件,然後在專案啟動時根據條件動態去載入對應的設定檔。
現在有三個配置,一個預設設定檔(application.properties:因為是SpringBoot指定的名字,所以叫預設設定檔),兩個指定環境設定檔(application-prod.properties和application-dev .properties:和對應的環境有關,所以叫它們指定環境設定檔)
application-dev.properties
模擬開發設定資訊
person.name=ZhangSan person.age=18
application-prod.properties
#就模擬生產配置資訊
person.name=LiSi person.age=19
application.properties
就指定一個服務的連接埠號碼和工程在啟動的時候需要載入的設定文件,SpringBoot會自動去匹配application-{spring.profiles.active}.properties,然後就會找到application-dev.properties設定檔
server.port=8080 spring.profiles.active=dev #我们可以指定SpringBoot在启动时加载那个对应的配置文件
建立了一個事例Person類,讓它被實例化的時候從設定檔讀取訊息,讀取規則:person.{屬性名稱},讓把建立new一個Person的實例,加入到IOC容器中。
建立一個get請求,傳回我們的Person的事例,我們看perosn的屬性值能否根據我們在application.properties設定檔中指定spring.profiles.active的屬性載入對應的設定文件,Person實例中的值是不是預期值
@ConfigurationProperties(prefix = "person") //初始化的时候从配置文件中读取person.{属性名}的信息赋值给当前对象 @Data public class Person { private String name; private Integer age; } @Configuration //配置文件信息,将Person实例注入到IOC容器中 public class MyConfig { @Bean public Person person() { return new Person(); } }
@RestController //建立get請求,傳回我們的Person的事例,我們看perosn的屬性值能否根據我們在application.properties設定檔中指定spring .profiles.active的屬性載入對應的設定文件,Person實例中的值是不是預期值
@RequestMapping("/user") public class PersonController { @Autowired private Person person; @GetMapping public Person getPerson() { return person; } }
工程跑起來,訪問http://localhost:8080/user,回傳結果:
{"name":"ZhangSan","age":18}
把application.properties中的spring.profiles.active的值修改成prod,請求訪問http: //localhost:8080/user,回傳結果:
{"name":"LiSi","age":19}
另外如果我們已經將工程打包成jar,可以在啟動SpringBoot工程的時候,透過命令列給參數賦值的方式指定spring.profiles.active的值
java -jar .\web-02-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
還有一個比較實用的,就是SpringBoot預設載入application.properties和application.yaml的路徑和優先順序(從SpringBoot官方文件中看到的:https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config. application-json),載入的優先權:
jar套件所在的目錄下面的/config/{一級子目錄}下面的application.properties和application.yaml
jar套件所在的目錄下面的/config下面的application.properties和application.yaml
jar套件所在的目錄下面的application.properties和application.yaml
classpath下面/config裡面的application.properties和application.yaml
classpath下面的application.properties和application.yaml
場景就是:我們的專案跑了很久了,突發狀況需要修改設定檔。但是以前的舊檔案我們也不敢隨意修改,這時候我們就可以在優先順序高的地方放我們的新的配合文件了。
以上是springboot指定profiles啟動失敗問題如何解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!