Ubuntu 22.04 安装 Apache DeltaSpike 指南
在 Ubuntu 22.04 上集成 Apache DeltaSpike:安装 JDK 11 与 Maven,按模块引入依赖,编写 Weld SE 最小 CDI 示例并完成配置注入、国际化与运行时引导的真实运行验证。
Ubuntu 22.04 安装 Apache DeltaSpike 指南
Apache DeltaSpike 是一组可移植的 CDI 扩展,作为库通过 Maven 依赖引入,无独立守护进程。本文在 Ubuntu 22.04 服务器上使用 JDK 11 与 Maven,完成模块引入、最小 CDI 示例编写及真实编译运行。
一、适用场景与前置条件
1.1 组件定位
DeltaSpike 按功能拆分为多个模块,核心坐标如下:
org.apache.deltaspike.core:deltaspike-core-api/deltaspike-core-impl:配置、国际化、BeanProvider。org.apache.deltaspike.cdictrl:deltaspike-cdictrl-weld:编程式启动/关闭 CDI 运行时。org.apache.deltaspike.data.*:JPA 仓储扩展;org.apache.deltaspike.jsf.*、org.apache.deltaspike.scheduler.*等按需选用。
1.2 环境要求
| 项目 | 要求 |
|---|---|
| 操作系统 | Ubuntu 22.04 LTS |
| JDK | 11(或 8) |
| 构建工具 | Maven 3.6+ |
| 网络 | 可访问 Maven Central(repo1.maven.org) |
本文实测环境:Ubuntu 22.04.5 LTS,OpenJDK 11.0.32.1,Maven 3.6.3。
二、JDK 与 Maven 安装
2.1 更新索引并安装
apt-get update -y
DEBIAN_FRONTEND=noninteractive apt-get install -y openjdk-11-jdk maven
2.2 版本验证
java -version
mvn -version
真实回显:
openjdk version "11.0.32.1" 2026-08-18
OpenJDK Runtime Environment (build 11.0.32.1+1-post-1ubuntu1-22.04-Ubuntu)
OpenJDK 64-Bit Server VM (build 11.0.32.1+1-post-1ubuntu1-22.04-Ubuntu, mixed mode, sharing)
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.32.1, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
三、DeltaSpike 模块依赖引入
3.1 可用版本核对
curl -s https://repo1.maven.org/maven2/org/apache/deltaspike/core/deltaspike-core-api/maven-metadata.xml \
| grep -oE '<version>[^<]+</version>' | tail -5
回显(节选):
<version>1.9.4</version>
<version>1.9.5</version>
<version>1.9.6</version>
<version>2.0.0</version>
<version>2.0.1</version>
JDK 11 下推荐使用 1.9.6(javax.* 命名空间)或 2.0.x。
3.2 Maven 坐标清单
| 用途 | groupId | artifactId | 建议 scope |
|---|---|---|---|
| 核心 API | org.apache.deltaspike.core | deltaspike-core-api | compile |
| 核心实现 | org.apache.deltaspike.core | deltaspike-core-impl | runtime |
| 运行时控制 | org.apache.deltaspike.cdictrl | deltaspike-cdictrl-weld | compile |
| 轻量 CDI 运行时 | org.jboss.weld.se | weld-se-core | compile |
3.3 创建工程与 pom.xml
mkdir -p /root/deltaspike-demo/src/main/java/com/example
mkdir -p /root/deltaspike-demo/src/main/resources/META-INF
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>deltaspike-demo</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<deltaspike.version>1.9.6</deltaspike.version>
<weld.version>3.1.9.Final</weld.version>
<exec.mainClass>com.example.App</exec.mainClass>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.deltaspike.core</groupId>
<artifactId>deltaspike-core-api</artifactId>
<version>${deltaspike.version}</version>
</dependency>
<dependency>
<groupId>org.apache.deltaspike.core</groupId>
<artifactId>deltaspike-core-impl</artifactId>
<version>${deltaspike.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.deltaspike.cdictrl</groupId>
<artifactId>deltaspike-cdictrl-weld</artifactId>
<version>${deltaspike.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.weld.se</groupId>
<artifactId>weld-se-core</artifactId>
<version>${weld.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<mainClass>${exec.mainClass}</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
四、最小 CDI 示例编译运行
4.1 配置与源码
src/main/resources/META-INF/beans.xml:
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_2.0.xsd"
bean-discovery-mode="all" version="2.0"/>
src/main/resources/META-INF/apache-deltaspike.properties:
app.greeting=Hello DeltaSpike
app.name=Apache DeltaSpike
app.version=1.9.6
GreetingService.java(配置注入):
package com.example;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.deltaspike.core.api.config.ConfigProperty;
import org.apache.deltaspike.core.api.config.ConfigResolver;
@Named
public class GreetingService {
@Inject
@ConfigProperty(name = "app.greeting", defaultValue = "Hi")
private String greeting;
@Inject
@ConfigProperty(name = "app.name")
private String name;
public void run() {
System.out.println("[DeltaSpike] app.greeting = " + greeting);
System.out.println("[DeltaSpike] app.name = " + name);
System.out.println("[DeltaSpike] ConfigResolver app.version = "
+ ConfigResolver.getPropertyValue("app.version", "unknown"));
}
}
I18nService.java(消息插值,MessageContext 由 DeltaSpike 注入):
package com.example;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.deltaspike.core.api.message.MessageContext;
@Named
public class I18nService {
@Inject
private MessageContext messageContext;
public void run() {
String msg = messageContext.message()
.template("Welcome %s, running DeltaSpike %s")
.argument("Apache DeltaSpike").argument("1.9.6")
.toString();
System.out.println("[DeltaSpike i18n] " + msg);
}
}
App.java(Weld SE 引导):
package com.example;
import org.apache.deltaspike.core.api.provider.BeanProvider;
import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;
public class App {
public static void main(String[] args) {
Weld weld = new Weld();
WeldContainer container = weld.initialize();
try {
BeanProvider.getContextualReference(GreetingService.class).run();
BeanProvider.getContextualReference(I18nService.class).run();
} finally {
container.shutdown();
}
}
}
4.2 编译
cd /root/deltaspike-demo && mvn -q -B compile
首次编译会从 Maven Central 下载依赖,退出码为 0 即成功。如需限制构建 JVM 堆内存:
export MAVEN_OPTS="-Xms256m -Xmx512m"
4.3 运行与真实回显
cd /root/deltaspike-demo && mvn -B exec:java
真实回显(节选):
INFO: WELD-ENV-002003: Weld SE container ... initialized
[DeltaSpike] app.greeting = Hello DeltaSpike
[DeltaSpike] app.name = Apache DeltaSpike
[DeltaSpike] ConfigResolver app.version = 1.9.6
[DeltaSpike i18n] Welcome Apache DeltaSpike, running DeltaSpike 1.9.6
INFO: WELD-ENV-002001: Weld SE container ... shut down
[INFO] BUILD SUCCESS
五、使用 DeltaSpike 引导类启动 CDI 运行时
除直接使用 Weld 外,DeltaSpike 提供 CdiContainerLoader / CdiContainer 统一引导:
package com.example;
import org.apache.deltaspike.cdise.api.CdiContainer;
import org.apache.deltaspike.cdise.api.CdiContainerLoader;
import org.apache.deltaspike.core.api.provider.BeanProvider;
public class BootstrapApp {
public static void main(String[] args) {
CdiContainer cdiContainer = CdiContainerLoader.getCdiContainer();
cdiContainer.boot();
try {
System.out.println("[DeltaSpike] CdiContainer impl = "
+ cdiContainer.getClass().getName());
BeanProvider.getContextualReference(GreetingService.class).run();
} finally {
cdiContainer.shutdown();
}
}
}
运行:
cd /root/deltaspike-demo && mvn -B exec:java -Dexec.mainClass=com.example.BootstrapApp
真实回显:
[DeltaSpike] CdiContainer impl = org.apache.deltaspike.cdise.weld.WeldContainerControl
[DeltaSpike] app.greeting = Hello DeltaSpike
[INFO] BUILD SUCCESS
六、卸载
rm -rf /root/deltaspike-demo
rm -rf ~/.m2/repository/org/apache/deltaspike
apt-get remove -y openjdk-11-jdk maven
七、常见问题
Q1:mvn -q -B compile 无输出?
-q 表示静默模式,无输出且退出码为 0 即代表成功;需要完整日志时去掉 -q。
Q2:MessageContext 插值输出仍是 {0}?
DeltaSpike 默认插值器按 %s(String.format)风格解析,模板应使用 %s 占位符,例如 Welcome %s, running DeltaSpike %s。
Q3:BeanProvider.getContextualReference(...) 抛异常?
确认 beans.xml 存在且 bean-discovery-mode="all",并保证目标类被 @Named/@ApplicationScoped 等注解标记为 bean。