我们常见的启动Jar包的时候,都是指定Jar包自身内部的配置文件,比如Jar包内部有application-dev.yml,application-uat.yml,application-release.yml配置文件。我们启动的时候直接使用--spring.profile=dev即可使用。

但是我在Windows启动Apollo的Jar包的时候,需要制定外部配置文件,特此记录本篇文章。

正文

使用spring boot默认的配置文件路径

EnvironmentPostProcessor,通过从已知文件位置加载properties来配置上下文环境。默认情况下,properties将从以下位置的“application.properties”和/或“application.yml”文件中加载:

file:./config/:
file:./
classpath:config/
classpath:

“spring.config.name”属性可用于指定要加载的替代名称,“spring.config.location”属性可用来指定替代搜索位置或特定文件

上面其实已经说的很详细了,我们可以指定spring.config.location来指定配置文件或配置文件的位置。比如默认找的是文件名是:application。我们可以通过spring.config.name来指定默认的文件名

实战

比如一个文件夹有如下文件:

abc.jar

config/application.properties

java -jar XXX.jar --spring.config.location=./config/

jar启动参数格式

java命令启动参数标准格式(强制,非标准将导致无法获取值!)

java [-D系统属性] -jar app.jar [--SpringBoot配置参数] [普通程序参数]

这个命令的解析过程是严格按顺序执行的:


1️⃣ JVM 启动阶段

  • JVM 解析所有 -D 系统属性和其他 JVM 参数(-Xmx-XX 等)。
  • 这些值进入 JVM 的系统属性表,可以通过 System.getProperty() 读取。
  • 此时应用代码还没开始跑,Spring Boot 也没参与。

2️⃣ 可执行 Jar 解包 & Main 方法入口

  • -jar app.jar 触发 JVM 读取 JAR 的 MANIFEST.MF 中的 Main-Class
  • JVM 调用那个类的 public static void main(String[] args) 方法。
  • 这里 args 只包含 -jar 后面的部分(例如 --server.port=9000 和 datafile.csv)。

3️⃣ Spring Boot 启动引导 (SpringApplication.run)

  • 先读 JVM 系统属性-D 的)并整合到 Environment 中。
  • 再解析命令行参数
    • 所有以 -- 开头的会当作 Spring Boot 配置项放入环境。
    • 不带 -- 的当作普通参数,保留在 ApplicationArguments.getNonOptionArgs()

4️⃣ Profile 激活 & 配置加载

  • 如果 spring.profiles.active 已设置(无论来自 -D 还是 --),先激活对应 profile。
  • 加载对应的 application-{profile}.yml / .properties

5️⃣ 应用启动完成

  • 所有 Bean 初始化、端口监听启动。
  • 至此,参数的“传递与等待”链路终结。

比如指定参数的 一个配置是 spring.abc=zhangsan

有2种方式

第一种 java -jar -Dspring.abc=zhangsan abc.jar

第二种 java -jar abc.jar --spinrg.abc=zhangsan

举一反三:spring.profiles.active 怎么写,写在哪?

spring.profiles.active 这个参数非常常用,它既可以用作 JVM 系统属性,也可以用作 Spring Boot 的命令行参数,效果一样,但位置放错会导致不生效。

方式一:作为 JVM 系统属性-D,放在 -jar 前)

java -Dspring.profiles.active=dev -jar app.jar

方式二:作为 Spring Boot 命令行参数--,放在 -jar 后)

java -jar app.jar --spring.profiles.active=dev

错误写法!

错误写法!
java -jar app.jar -Dspring.profiles.active=dev

从JVM配置读取的时候,-jar前面 没有 -Dspring.profiles.active 配置。当spring开始解析的时候,命令行里,也没有 --spring.profiles.active 所以这种配置是无效的!

特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤

免责声明:
本站文章旨在总结学习互联网技术过程中的经验与见解。任何人不得将其用于违法或违规活动!所有违规内容均由个人自行承担,与作者无关。