CentOS 8 安装 Apache DeltaSpike 指南
在 CentOS 8 服务器上从零集成 Apache DeltaSpike:安装 JDK 与 Maven、按模块引入 Maven 依赖、编写 Weld SE 最小 CDI 示例并完成真实编译运行与验证,附版本管理与卸载方法。
CentOS 8 安装 Apache DeltaSpike 指南
Apache DeltaSpike 是一组可移植的 CDI(Contexts and Dependency Injection)扩展,面向 Java EE / Jakarta EE 应用,通过 Maven 依赖以库的形式引入,无独立守护进程。本文在 CentOS 8 服务器上完成从环境准备、模块依赖引入到最小 CDI 示例端到端运行的完整过程。
一、适用场景与前置条件
1.1 组件定位
DeltaSpike 由若干独立模块组成,均以 org.apache.deltaspike.* 坐标发布:
deltaspike-core-api/deltaspike-core-impl:配置、国际化、BeanProvider 等核心能力。deltaspike-cdictrl-weld:以编程方式启动/关闭轻量 CDI 运行时。deltaspike-data-module-*:JPA 仓储(Repository)扩展。deltaspike-jsf-module-*、deltaspike-scheduler-module-*等:按需引入。
1.2 环境要求
| 项目 | 要求 |
|---|---|
| 操作系统 | CentOS Linux release 8.x |
| JDK | 8 或 11 |
| 构建工具 | Maven 3.5+ |
| 网络 | 可访问 Maven Central(repo1.maven.org) |
本文实测环境:CentOS Linux release 8.4.2105,默认 JDK 1.8.0_312,附加 java-11-openjdk 11.0.13.0.8,Maven 3.5.4。
二、JDK 与 Maven 安装
2.1 安装 JDK
CentOS 8 自带仓库可直接安装 OpenJDK:
dnf -y install java-11-openjdk-devel
安装后确认默认 java 指向的版本(系统可能同时保留 JDK 8):
java -version
真实回显:
openjdk version "1.8.0_312"
OpenJDK Runtime Environment (build 1.8.0_312-b07)
OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode)
如倾向于使用 JDK 11,可切换 alternatives:
alternatives --config java
2.2 安装 Maven
dnf -y install maven
mvn -version
真实回显:
Apache Maven 3.5.4 (Red Hat 3.5.4-5)
Maven home: /usr/share/maven
Java version: 1.8.0_312, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64/jre
2.3 版本验证
java -version 2>&1 | head -1
mvn -v 2>&1 | head -1
任一命令正常输出版本号即代表 JDK 与 Maven 就绪。
三、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>
1.9.x 系列使用 javax.* 命名空间,兼容 JDK 8/11;本文选用 1.9.6。
3.2 Maven 坐标清单
| 模块 | groupId | artifactId | 说明 |
|---|---|---|---|
| 核心 API | org.apache.deltaspike.core | deltaspike-core-api | 编译期注解与接口 |
| 核心实现 | org.apache.deltaspike.core | deltaspike-core-impl | 运行时实现(runtime) |
| 运行时控制 | org.apache.deltaspike.cdictrl | deltaspike-cdictrl-weld | Weld 运行时引导 |
| 轻量 CDI 运行时 | org.jboss.weld.se | weld-se-core | SE 环境 CDI 实现 |
3.3 版本管理
在 pom.xml 中集中声明版本,避免逐条写死:
<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>
</properties>
<dependencyManagement>
<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>
</dependency>
<dependency>
<groupId>org.apache.deltaspike.cdictrl</groupId>
<artifactId>deltaspike-cdictrl-weld</artifactId>
<version>${deltaspike.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
3.4 创建示例工程
mkdir -p /root/deltaspike-demo/src/main/java/com/example
mkdir -p /root/deltaspike-demo/src/main/resources/META-INF
pom.xml:
<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
src/main/java/com/example/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"));
}
}
src/main/java/com/example/App.java:
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();
} finally {
container.shutdown();
}
}
}
4.2 编译
cd /root/deltaspike-demo && mvn -q -B compile
退出码为 0、无报错即编译成功。若需限制构建 JVM 内存,可使用:
export MAVEN_OPTS="-Xms256m -Xmx512m"
4.3 运行与真实回显
cd /root/deltaspike-demo && mvn -B exec:java
真实回显(节选):
INFO: Custom config found by DeltaSpike. Name: 'META-INF/apache-deltaspike.properties', URL: 'file:/root/deltaspike-demo/target/classes/META-INF/apache-deltaspike.properties'
INFO: Computed the following DeltaSpike ProjectStage: Production
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
INFO: WELD-ENV-002001: Weld SE container ... shut down
[INFO] BUILD SUCCESS
至此,CentOS 8 上 DeltaSpike 的核心配置注入能力已端到端跑通。
五、版本验证与依赖确认
查看实际解析到的坐标与传递依赖:
cd /root/deltaspike-demo && mvn -B dependency:tree \
| grep -E 'org.apache.deltaspike|org.jboss.weld'
真实回显:
[INFO] +- org.apache.deltaspike.core:deltaspike-core-api:jar:1.9.6:compile
[INFO] +- org.apache.deltaspike.core:deltaspike-core-impl:jar:1.9.6:runtime
[INFO] +- org.apache.deltaspike.cdictrl:deltaspike-cdictrl-weld:jar:1.9.6:compile
[INFO] | \- org.apache.deltaspike.cdictrl:deltaspike-cdictrl-api:jar:1.9.6:compile
[INFO] \- org.jboss.weld.se:weld-se-core:jar:3.1.9.Final:compile
六、卸载
删除示例工程与本地仓库缓存:
rm -rf /root/deltaspike-demo
rm -rf ~/.m2/repository/org/apache/deltaspike
如需移除 JDK / Maven:
dnf remove -y java-11-openjdk-devel maven
七、常见问题
Q1:mvn 报 Cannot find matching toolchain 或使用了非预期 JDK?
执行 alternatives --config java 选择目标 JDK,再通过 echo $JAVA_HOME 确认;也可在构建时显式指定。
Q2:@ConfigProperty 注入为 null?
确认 META-INF/apache-deltaspike.properties 位于运行时 classpath(target/classes/META-INF/),并检查键名拼写与 @ConfigProperty(name=...) 一致,必要时给出 defaultValue。
Q3:出现大量 WELD-001478 ... only be invoked in the @Priority part of the chain 告警?
这是 Weld 对 DeltaSpike 内置拦截器优先级的提示性告警,不影响运行结果,可忽略。