Boot 构建与启动实验(U22)
独立新工程:Boot4.0.9 / Framework7.0.10 / Liberica21.0.11(本机macOS arm64);继承U03已锁维护组合。未使用Cloud、数据库、缓存或MQ,不增加无关运行依赖。旧3.3.3机制与layertools实验保留在原Boot实验,两个工程分别构建。
从仓库根执行公开入口:
JAVA_HOME=$(/usr/libexec/java_home -v21) python3 labs/boot-startup/run.py依赖Python3、Maven及本机JDK21;JAVA_HOME同时传给Maven和java。入口对每条命令设置180秒上限,正常运行退出0;runner失败和同名定义冲突的子进程必须退出1并含各自根因与事件/分析报告。错误输入不是“任意异常即通过”。命令原始输出在 ~/.cache/software-engineering-study/java-depth-impl/u22/modern/;mvn clean不会删除这些日志。实际结果见evidence。
| 组 | 输入/断言 | 证明边界 |
|---|---|---|
| 版本与归档 | dependency:tree核对Boot4.0.9/Framework7.0.10;manifest、嵌套依赖、imports、metadata两个属性、layers.idx | 实际解析/真实归档,不证明生产容量 |
| 条件与退让 | auto/user/disabled/excluded/user+disabled | Bean数量、默认定义是否存在、真实实现 |
| 事件与失败 | 正常完整ready→closed;runner异常failed→closed;默认同名冲突失败;显式覆盖后唯一结果first | NONE真实上下文;覆盖顺序仅本工程实测,不把@Import文本序当通用保证 |
| 应用类型 | 基础、仅WebFlux、仅MVC、双栈 | NONE/REACTIVE/SERVLET/SERVLET;只构造SpringApplication观察推导,不开端口 |
| 分层与恢复 | tools list-layers/extract→提取产物java -jar→检查默认实现与完整事件→删唯一提取目录 | 真实提取/恢复启动,不运行容器镜像;旧layertools不能套新工程 |
profile切换每次都clean package,避免复用上次repackage产物误把旧类路径当新类路径。最后恢复默认基础starter构建。所有临时制品在本工程target;唯一提取目录在finally清理,不操作其他数据库、浏览器数据或全局服务。
真正编译的自动配置
主程序没有ComponentScan,候选由imports发现。完整实现统一维护于源文件,正文不复制另一个版本。
package study.startup;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
@AutoConfiguration
@EnableConfigurationProperties(NoticeProperties.class)
@ConditionalOnProperty(name="lab.notice.enabled", havingValue="true", matchIfMissing=true)
public class NoticeAutoConfiguration {
public record NoticeClient(String kind, String message) {}
@Bean
@ConditionalOnMissingBean(NoticeClient.class)
NoticeClient noticeClient(NoticeProperties properties) {
return new NoticeClient("auto", properties.message());
}
}package study.startup;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.bind.DefaultValue;
@ConfigurationProperties("lab.notice")
public record NoticeProperties(@DefaultValue("true") boolean enabled,
@DefaultValue("hello") String message) {}study.startup.NoticeAutoConfiguration配置处理器在JDK21生成IDE提示元数据;它与运行时绑定/校验、自动配置候选注册以及条件预筛元数据不同。JDK23+应显式配置处理器并独立复测,本实验不外推。缺失/错误类型/约束的完整EX1归U23;Servlet真实端口、探针及健康归U24;Native归U28。
来源:权威讲解、docs/design/java-depth-engineering-baseline.md(版本组合)、docs/audits/java-depth-u22-scope.md(范围审读)。