如何启动带CDI特性的Helidon 4.0 SE服务器?依赖及启动配置解析
启动带CDI特性的Helidon 4.0 SE服务器
所需依赖添加
要在Helidon 4.0 SE中启用CDI,需添加以下Maven依赖(Gradle可对应转换):
<!-- Helidon SE CDI集成核心依赖 --> <dependency> <groupId>io.helidon.integrations.cdi</groupId> <artifactId>helidon-integrations-cdi-se</artifactId> <version>4.0.0</version> </dependency> <!-- CDI API 依赖(若项目未间接引入) --> <dependency> <groupId>jakarta.enterprise</groupId> <artifactId>jakarta.enterprise.cdi-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>
若需要完整CDI容器实现(如Weld),可额外添加:
<dependency> <groupId>org.jboss.weld.se</groupId> <artifactId>weld-se-core</artifactId> <version>5.1.2.Final</version> </dependency>
应用启动阶段的变更
Helidon SE默认不加载CDI容器,需在启动代码中显式初始化并集成到WebServer:
- 初始化CDI容器并启动服务器
import io.helidon.integrations.cdi.se.CdiExtension; import io.helidon.webserver.WebServer; import jakarta.enterprise.inject.se.SeContainer; import jakarta.enterprise.inject.se.SeContainerInitializer; public class Main { public static void main(String[] args) { // 初始化CDI容器,注册Helidon SE扩展 SeContainerInitializer initializer = SeContainerInitializer.newInstance() .addExtensions(new CdiExtension()); try (SeContainer container = initializer.initialize()) { // 从CDI容器获取已配置的WebServer实例并启动 WebServer server = container.select(WebServer.class).get(); server.start().await(); System.out.println("Server running at: " + server.baseUri()); } } }
- 直接构建WebServer时集成CDI
WebServer server = WebServer.builder() .addExtension(new CdiExtension()) .addService(container.select(HelloService.class).get()) // 从CDI获取业务Bean .build() .start() .await();
加载作用域Bean
要让CDI作用域Bean(如@ApplicationScoped、@RequestScoped)正常加载使用:
- 给Bean类标注CDI作用域注解:
import jakarta.enterprise.context.ApplicationScoped; @ApplicationScoped public class HelloService { public String greet(String name) { return "Hello, " + name + "!"; } }
- 通过
@Inject注入到其他CDI管理的类中,或直接从容器获取:
import jakarta.inject.Inject; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.QueryParam; @Path("/greet") public class GreetResource { private final HelloService helloService; @Inject public GreetResource(HelloService helloService) { this.helloService = helloService; } @GET public String getGreeting(@QueryParam("name") String name) { return helloService.greet(name); } }
- 若Bean不在默认扫描路径下,需初始化容器时指定扫描包:
initializer.scanPackages("com.your.app.package");
内容的提问来源于stack exchange,提问作者himanshu_mps
相关产品推荐
相关产品推荐

