如何用Quarkus能力扩展现有Vert.x应用?含启动等核心指引
一、改造应用启动逻辑,适配Quarkus生命周期
你原来的main方法启动逻辑要改成Quarkus托管的方式,才能享受到dev模式的热重载:
先添加Quarkus Vert.x扩展依赖:
Maven在pom.xml中添加:<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-vertx</artifactId> </dependency>Gradle对应添加:
implementation 'io.quarkus:quarkus-vertx'替换原有的
main方法:
推荐用@Startup注解的CDI Bean初始化Vert.x和加载Verticles,Quarkus会自动管理生命周期:import io.quarkus.runtime.Startup; import io.vertx.core.Vertx; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; @ApplicationScoped @Startup public class VertxAppBootstrap { @Inject Vertx vertx; // Quarkus自动注入预配置的Vertx实例 void init() { // 直接复用你原有的Verticle加载逻辑 vertx.deployVerticle(new UserServiceVerticle()); vertx.deployVerticle(new OrderServiceVerticle()); // ... 部署所有需要的Verticles } }如果需要处理启动参数,也可以用
@QuarkusMain实现QuarkusApplication接口,灵活度更高:import io.quarkus.runtime.Quarkus; import io.quarkus.runtime.QuarkusApplication; import io.quarkus.runtime.annotations.QuarkusMain; import io.vertx.core.Vertx; import jakarta.inject.Inject; @QuarkusMain public class AppMain implements QuarkusApplication { @Inject Vertx vertx; @Override public int run(String... args) throws Exception { // 这里可以处理原main方法中的配置收集逻辑 // 然后部署Verticles vertx.deployVerticle(new UserServiceVerticle()); Quarkus.waitForExit(); return 0; } }在
application.properties中配置Vert.x参数(按需调整):quarkus.vertx.event-loops.pool-size=16 quarkus.vertx.prefer-native-transport=true
二、打包配置:放弃FatJAR,生成普通JAR+依赖目录
Quarkus默认打FatJAR,按以下配置改成拆分式打包:
Maven配置
修改pom.xml中的quarkus-maven-plugin:
<build> <plugins> <plugin> <groupId>io.quarkus</groupId> <artifactId>quarkus-maven-plugin</artifactId> <version>${quarkus.version}</version> <executions> <execution> <goals> <goal>build</goal> </goals> <configuration> <uberJar>false</uberJar> <!-- 关闭FatJAR打包 --> <outputDirectory>${project.build.directory}/quarkus-app</outputDirectory> <copy-dependencies>true</copy-dependencies> <!-- 复制依赖到单独目录 --> <dependencyDirectory>${project.build.directory}/quarkus-app/lib</dependencyDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build>
Gradle配置
在build.gradle中设置:
quarkus { build { uberJar = false outputDirectory = file("${buildDir}/quarkus-app") copyDependencies = true dependencyDirectory = file("${buildDir}/quarkus-app/lib") } }
打包完成后,target/quarkus-app(Maven)或build/quarkus-app(Gradle)下会生成三个部分:app/存放你的代码和资源,lib/存放所有依赖,quarkus-run.jar是启动器,运行时执行java -jar quarkus-run.jar即可。
三、适配Jib容器构建
既然已经在用Jib,只需调整配置指向Quarkus的打包产物:
Maven配置
更新pom.xml中的Jib插件:
<plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-maven-plugin</artifactId> <version>${jib.version}</version> <configuration> <from> <image>eclipse-temurin:17-jre</image> <!-- 选择你的JRE基础镜像 --> </from> <to> <image>your-registry/your-app:latest</image> <!-- 你的镜像仓库地址 --> </to> <container> <entrypoint>java</entrypoint> <args> <arg>-jar</arg> <arg>/app/quarkus-run.jar</arg> </args> <ports> <port>8080</port> <!-- 你的应用端口 --> </ports> </container> <extraDirectories> <paths> <path>${project.build.directory}/quarkus-app</path> <!-- 将Quarkus打包目录复制到容器 --> </paths> <outputDirectory>/app</outputDirectory> </extraDirectories> </configuration> </plugin>
Gradle配置
在build.gradle中设置:
jib { from { image = 'eclipse-temurin:17-jre' } to { image = 'your-registry/your-app:latest' } container { entrypoint = ['java', '-jar', '/app/quarkus-run.jar'] ports = ['8080'] } extraDirectories { paths = [file("${buildDir}/quarkus-app")] outputDirectory = '/app' } }
执行mvn jib:build或./gradlew jib即可构建镜像,容器启动时会自动运行Quarkus的启动JAR。
四、调整Log4j2配置
Quarkus默认使用JBoss Logging,切换到Log4j2只需几步:
添加Quarkus Log4j2扩展依赖:
Maven:<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-logging-log4j2</artifactId> </dependency>Gradle:
implementation 'io.quarkus:quarkus-logging-log4j2'同时排除默认的JBoss Logging依赖(Maven示例):
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-core</artifactId> <exclusions> <exclusion> <groupId>org.jboss.logmanager</groupId> <artifactId>jboss-logmanager</artifactId> </exclusion> </exclusions> </dependency>将你原有的Log4j2配置文件(
log4j2.xml或log4j2.properties)放到src/main/resources下,直接复用即可,示例:<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> <!-- 你的自定义Logger配置 --> </Loggers> </Configuration>在
application.properties中开启Log4j2:quarkus.log.log4j2.enabled=true
五、启动Dev模式享受热重载
所有配置完成后,执行mvn quarkus:dev(Maven)或./gradlew quarkusDev(Gradle)即可启动dev模式。此时修改Verticle或业务类,Quarkus会自动检测变化并热重载,无需重启应用。注意:
- 如果Verticle是用
new实例化的,热重载后会重新部署新实例;如果是CDI注入的Verticle,需要添加@ApplicationScoped等CDI注解,确保热重载时能创建新实例。 - 修改配置文件也会自动生效,无需重启。
内容的提问来源于stack exchange,提问作者stwissel

