You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Quarkus能力扩展现有Vert.x应用?含启动等核心指引

将现有Vert.x应用接入Quarkus的实操指南

一、改造应用启动逻辑,适配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 16:52:32