Ubuntu 22.04 安装 Apache DeltaSpike 指南

在 Ubuntu 22.04 上集成 Apache DeltaSpike:安装 JDK 11 与 Maven,按模块引入依赖,编写 Weld SE 最小 CDI 示例并完成配置注入、国际化与运行时引导的真实运行验证。

Apache DeltaSpikeApache DeltaSpike2026/10/11

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
JDK11(或 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 坐标清单

用途groupIdartifactId建议 scope
核心 APIorg.apache.deltaspike.coredeltaspike-core-apicompile
核心实现org.apache.deltaspike.coredeltaspike-core-implruntime
运行时控制org.apache.deltaspike.cdictrldeltaspike-cdictrl-weldcompile
轻量 CDI 运行时org.jboss.weld.seweld-se-corecompile

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。