我们常见的启动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 所以这种配置是无效的!
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤
免责声明: 本站文章旨在总结学习互联网技术过程中的经验与见解。任何人不得将其用于违法或违规活动!所有违规内容均由个人自行承担,与作者无关。
