必须在applicationrunner执行前完成平台探测,将结果存入spring environment的systemproperties中键为spring.platform.type,后续所有自动配置均基于该值分支处理,否则@conditionalonproperty等注解因environment未就绪而失效。

当SpringBoot项目需要在Windows开发机、Linux测试服务器、Docker容器和K8s生产集群中运行时,环境差异会导致配置加载顺序错乱、文件路径解析失败、端口冲突、时区不一致等问题,必须通过统一机制识别并收敛这些自动配置差异。
识别当前运行平台的真实类型
第一步:在启动类中添加平台探测逻辑,避免依赖System.getProperty("os.name")这种易被伪造的值。
第二步:读取/proc/sys/kernel/osrelease(Linux)、注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion(Windows)或/proc/version(容器内),用File.exists()逐个探测真实存在路径来判定平台。
第三步:将探测结果存入Spring Environment的systemProperties中,键名为spring.platform.type,值为windows / linux / docker / k8s,后续所有自动配置都基于该值分支处理。
【必须在ApplicationRunner执行前完成探测】否则@ConditionalOnProperty等注解会因Environment未就绪而失效。
统一覆盖自动配置的生效条件
方法一:用@ConditionalOnExpression替代分散的@ConditionalOnClass/@ConditionalOnProperty
例如统一控制DataSource自动配置是否启用:@ConditionalOnExpression("#{environment['spring.platform.type'] != 'docker' || !environment.containsProperty('spring.datasource.url')}")
方法二:自定义AutoConfigurationImportSelector子类,在selectImports中根据spring.platform.type动态过滤自动配置类列表,剔除不适用于当前平台的配置项(如Windows下禁用Linux信号处理器)。
方法三:重写Spring Boot的spring.factories中org.springframework.boot.autoconfigure.EnableAutoConfiguration条目,用自定义ClassLoader按平台加载不同jar包里的配置类,实现物理隔离。
跨平台路径与端口的标准化适配
第一步:禁止在application.yml中硬编码file://路径,全部改用spring.resources.static-locations=classpath:/static/,file:${user.home}/app-data/。
第二步:对server.port使用占位符+Profile默认值:server: port: ${APP_PORT:8080},再通过JVM参数-DAPP_PORT=8081或环境变量APP_PORT=8082覆盖。
第三步:对时区强制统一为UTC,在启动命令中加入-Duser.timezone=UTC,并在@Configuration类中注入TimeZone.setDefault(TimeZone.getTimeZone("UTC")),防止Linux系统默认CST导致定时任务偏移。
第四步:用Path.of(System.getProperty("user.home")).resolve("app-data")替代new File("~"),避免Windows反斜杠与Linux正斜杠解析差异。
容器化环境的特殊配置熔断
① 检测是否存在/.dockerenv文件且/proc/1/cgroup包含docker字符串,确认为Docker环境。
② 若检测到Docker,自动禁用JMX远程监控(com.sun.management.jmxremote相关配置)、关闭DevTools(spring.devtools.restart.enabled=false)、屏蔽本地文件监听器(FileSystemWatcher)。
③ 在K8s环境下,从/var/run/secrets/kubernetes.io/serviceaccount/token读取ServiceAccount Token,覆盖spring.cloud.kubernetes.enabled=true,同时禁用ConfigMap自动刷新(spring.cloud.kubernetes.config.enabled=false)防止与ConfigMap挂载冲突。
④ 对于Docker Desktop on Windows,额外检查WSL2内核版本,若低于5.10.16.3则强制设置spring.native.image.enabled=false,规避GraalVM native-image构建失败。











