Quarkus启动快的根本原因是将运行时工作(如类扫描、DI图生成、字节码增强)提前到构建期完成,实现毫秒级启动;而Spring Boot采用典型运行时容器模型,核心生命周期均在启动时执行。

Quarkus 为什么启动快,和 Spring Boot 有啥根本区别
Quarkus 启动快不是靠优化 JVM 参数,而是靠“提前把运行时该干的事,挪到构建期干”。它在 mvn package 阶段就做类路径扫描、依赖注入图生成、甚至部分字节码增强——所以运行时几乎不反射、不代理、不动态加载,java -jar 启动后直接进 main(),毫秒级就 ready。
Spring Boot 默认是典型的运行时容器模型:启动时才扫描 @Component、解析 @Autowired、初始化 BeanFactory。哪怕加了 spring-context-indexer,也只加速类扫描,核心生命周期仍在运行时。
这意味着:如果你项目里用了大量反射(比如手动 Class.forName())、或依赖非 Quarkus 原生支持的库(如某些老版本 org.apache.httpcomponents),构建会失败或运行时报 ClassNotFoundException ——这不是配置问题,是模型冲突。
用 Maven 搭出最小可运行 Quarkus 项目,绕过官方模板坑
别直接用 code.quarkus.io 生成的 zip 包——它默认带 quarkus-resteasy-reactive 和 quarkus-junit5,但新手常卡在 JSON 序列化行为不一致上(比如 LocalDateTime 直接报 500)。从零手搭更可控。
立即学习“Java免费学习笔记(深入)”;
- 用
mvn io.quarkus:quarkus-maven-plugin:3.16.1:create(指定明确版本,避免被镜像源缓存旧版) - 选
io.quarkus:quarkus-resteasy-classic而非 reactive 版本——它复用熟悉的 JAX-RS 注解,且 Jackson 默认启用,兼容 Spring Boot 习惯 - 删掉
src/test/java下自动生成的测试类,先跑通curl http://localhost:8080/hello再补测试 - 确保
pom.xml中<plugin>块里<configuration><source>17</source>和 JDK 实际版本一致,否则quarkus-maven-plugin会静默降级编译目标,导致 native 构建失败
application.properties 里最该配的三件事,不是 server.port
server.port 是最没风险的配置项;真正影响启动行为和本地调试体验的是这三项:
-
quarkus.http.host=0.0.0.0:不配的话,默认只绑localhost,Docker 容器内访问不到,也连不上 IDE 远程调试端口 -
quarkus.log.level=INFO(上线前必须设为WARN):Quarkus 默认日志级别是DEBUG,启动日志刷屏且掩盖真实错误,比如Failed to start application (with profile dev)这种关键提示会被埋掉 -
quarkus.datasource.db-kind=h2+quarkus.datasource.jdbc.url=jdbc:h2:mem:test:如果项目要连 DB,必须显式声明db-kind,否则 Quarkus 不会自动激活 JDBC 层,@Inject DataSource直接空指针——它不像 Spring Boot 那样靠 classpath 自推断
本地开发用 dev mode,但别信 “auto-restart” 的提示
mvn quarkus:dev 确实能热重载 Java 类和 application.properties,但它对以下修改完全无感:
- 新增或删改
@Path或@GET注解——必须手动Ctrl+C再重启 - 改动
src/main/resources/META-INF/beans.xml(哪怕只是加个空格)——Quarkus 不监听该路径,改了等于没改 - 切换 JDK 版本后首次运行 dev mode——它会复用旧的
target/quarkus-app/缓存,导致UnsupportedClassVersionError,得先mvn clean
Dev mode 的真正价值是调试:打断点进 ResteasyReactiveRequestContext 或 RoutingExchange 看请求流转,比读文档快得多。但别把它当生产环境模拟器——它的类加载机制和 native 模式、JVM 模式都不同。
Native 构建才是 Quarkus 的分水岭:一次 mvn package -Pnative 失败,90% 出在 JNI 调用、动态代理或第三方库的反射使用上。这些在 dev mode 里全被掩盖了。










