Ubuntu 22.04 安装 Apache OpenWebBeans 4.1.1 指南
Ubuntu 22.04 安装 Apache OpenWebBeans 4.1.1(Jakarta CDI 4.0 实现)指南:JDK 21 环境准备、1.x/2.x/4.x 版本选型对照、官方二进制分发包与 Maven 依赖引入两种方案、最小 CDI 应用运行验证与卸载,全程实测。
Ubuntu 22.04 安装 Apache OpenWebBeans 4.1.1 指南
目标:在 Ubuntu 22.04 服务器上完成 Apache OpenWebBeans 4.1.1(Jakarta Contexts and Dependency Injection 4.0 规范实现,以 Java jar 库 + SE 容器形态提供)的安装与验证。本文给出 JDK 21 环境准备、1.x/2.x/4.x 版本选型对照、「官方二进制分发包解压」与「Maven 依赖引入」两种方案,以及最小 CDI 应用运行验证与卸载方式。所有命令与回显均在 Ubuntu 22.04.5 + JDK 21 环境实测通过。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS(VERSION_CODENAME=jammy)
- 架构:x86_64(内核 6.8.0-138-generic)
- Java:OpenJDK 21.0.12.1(
openjdk-21-jdk-headless,Ubuntu 官方源) - 构建工具:Apache Maven 3.6.3(Ubuntu 官方源)
- OpenWebBeans 版本:4.1.1(当前最新稳定主线,实现 CDI 4.0,jakarta.* 命名空间)
- 演示账号:root
- 安装目录:
/opt/openwebbeans/ - 示例工程目录:
/root/owb-demo/
💡 说明:Apache OpenWebBeans 是 Apache 软件基金会下的 Jakarta Contexts and Dependency Injection(CDI 4.0)规范实现,发布物是 Java jar 库(
org.apache.webbeans.*/org.apache.openwebbeans.*),不提供独立守护进程与服务端口。所谓「安装」本质是准备好 JDK/构建环境,并把 OpenWebBeans 的 jar 以 classpath 或 Maven 依赖方式引入到你的 Java 工程,然后通过 CDI SE 容器(SeContainerInitializer)启动。
二、前置条件
2.1 更新软件源
sudo apt-get update
2.2 安装 JDK 21 与 Maven
OpenWebBeans 4.x 官方声明支持的最低 Java 版本为 11、当前最新支持版本为 21(见发行包 README),本指南按 JDK 21 实测:
sudo apt-get install -y openjdk-21-jdk-headless maven wget curl unzip
验证 JDK 与 Maven:
/usr/lib/jvm/java-21-openjdk-amd64/bin/java -version
mvn -version
实测回显:
openjdk version "21.0.12.1" 2026-08-18
OpenJDK Runtime Environment (build 21.0.12.1+1-1-22.04.4-Ubuntu)
OpenJDK 64-Bit Server VM (build 21.0.12.1+1-1-22.04.4-Ubuntu, mixed mode, sharing)
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 21.0.12.1, vendor: Ubuntu, runtime: /usr/lib/jvm/java-21-openjdk-amd64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "6.8.0-138-generic", arch: "amd64", family: "unix"
⚠️ 注意:
mvn -version中Java version必须为 21 才表示 Maven 正在使用 JDK 21。若显示17.0.x,说明默认 JVM 是 JDK 17,请在当前会话先执行:export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH
三、版本选型说明
通过 Apache 官方下载目录探测当前维护版本:
curl -s https://downloads.apache.org/openwebbeans/ | grep -oE 'href="[0-9.]+/"' | tr -d 'href="/'
实测返回:
1.2.8
1.7.6
2.0.28
4.0.3
4.1.1
各主线版本对照如下:
| 版本 | 实现的规范 | 包命名空间 | 所需 JDK | 结论 |
|---|---|---|---|---|
| 1.2.8 | CDI 1.0(JSR-299) | javax.* | JDK 8 | 仅存量兼容,不推荐新用 |
| 1.7.6 | CDI 1.2(JSR-346) | javax.* | JDK 8 | 仅存量兼容,不推荐新用 |
| 2.0.28 | CDI 2.0(JSR-365) | javax.* | JDK 8+ | 老应用迁移用 2.x |
| 4.0.3 | CDI 4.0(Jakarta EE 10) | jakarta.* | JDK 11+(官方支持至 21) | 生产首选 4.x |
| 4.1.1 | CDI 4.0(Jakarta EE 10) | jakarta.* | JDK 11+(官方支持至 21) | 当前最新稳定版 |
💡 版本选择建议:CDI 4.0 与旧版(CDI 1.x/2.x)在 API 上大体向后兼容,但包名从
javax.*全部迁移为jakarta.*。新工程一律选 4.1.1;存量javax.*工程若无法改造依赖,才退用 2.0.28。本指南全程按 JDK 21 + OpenWebBeans 4.1.1 实测。
4.1.1 的官方发布物(位于 https://downloads.apache.org/openwebbeans/4.1.1/):
| 文件 | 用途 |
|---|---|
| openwebbeans-distribution-4.1.1-binary.tar.gz | 二进制分发包(本文方案 A) |
| openwebbeans-distribution-4.1.1-binary.zip | 二进制分发包(zip 形态,内容相同) |
| openwebbeans-4.1.1-source-release.zip | 官方源码发布包(可自行 mvn package 构建) |
四、方案 A:官方二进制分发包安装(推荐)
4.1 下载分发包并校验
cd /tmp
wget -q https://downloads.apache.org/openwebbeans/4.1.1/openwebbeans-distribution-4.1.1-binary.tar.gz
ls -lh openwebbeans-distribution-4.1.1-binary.tar.gz
实测回显:
-rw-r--r-- 1 root root 1.5M Aug 7 16:54 openwebbeans-distribution-4.1.1-binary.tar.gz
计算本地 SHA512 并与官网 .sha512 校验文件核对:
sha512sum openwebbeans-distribution-4.1.1-binary.tar.gz
实测回显:
17d757df5f42e5737a649f46ad00481c09635a74439940a5c6d0cc9f2d39bc265315c7911948005cc125ff0ead9826e1c70075330275ad39251182e9b9a866b7 openwebbeans-distribution-4.1.1-binary.tar.gz
4.2 解压并安装到 /opt/openwebbeans
tar xzf openwebbeans-distribution-4.1.1-binary.tar.gz
mkdir -p /opt/openwebbeans
cp -r openwebbeans-distribution-4.1.1/* /opt/openwebbeans/
4.3 核对目录结构
ls /opt/openwebbeans/
实测回显:
KEYS LICENSE NOTICE README.txt api config install_owb_tomcat7.bat install_owb_tomcat7.sh install_owb_tomcat7_myfaces.sh openwebbeans-impl-4.1.1.jar plugins spi xbean-asm9-shaded-5.0.0.jar xbean-finder-shaded-5.0.0.jar
| 路径 | 内容 |
|---|---|
| openwebbeans-impl-4.1.1.jar | 核心实现(容器、BeanManager、代理生成、扫描) |
| spi/openwebbeans-spi-4.1.1.jar | SPI 接口层 |
| api/jakarta.enterprise.cdi-api-4.1.0.jar | CDI 4.1 标准 API(SeContainer/SeContainerInitializer 等) |
| api/jakarta.annotation-api-3.0.0.jar | Jakarta 注解 API(@PostConstruct 等) |
| plugins/openwebbeans-ee / -ee-common / -ejb / -el22 / -jms / -jsf / -osgi / -tomcat / -web 4.1.1.jar | 各类集成插件(EE/EJB/JMS/JSF/OSGi/Tomcat) |
| config/openwebbeans.properties | 默认配置文件(含全部默认参数,详见《配置参数详解》篇) |
| config/web.xml | Web 部署示例配置 |
| install_owb_tomcat7.sh | Tomcat 7/8/9 自动安装脚本 |
| xbean-finder-shaded / xbean-asm9-shaded | 类扫描与字节码增强依赖 |
4.4 补装 SE 模式运行所需的 API jar
二进制分发包自带 api/ 目录仅含 cdi-api 与 annotation-api;若用 CDI SE 容器(SeContainerInitializer)独立运行,还需 openwebbeans-se-4.1.1.jar(内含 SE 容器 ServiceLoader 注册)、jakarta.inject-api-2.0.1.jar、jakarta.interceptor-api-2.2.0.jar。从 Maven Central 补装:
cd /opt/openwebbeans/api
wget -q https://repo1.maven.org/maven2/org/apache/openwebbeans/openwebbeans-se/4.1.1/openwebbeans-se-4.1.1.jar
wget -q https://repo1.maven.org/maven2/jakarta/inject/jakarta.inject-api/2.0.1/jakarta.inject-api-2.0.1.jar
wget -q https://repo1.maven.org/maven2/jakarta/interceptor/jakarta.interceptor-api/2.2.0/jakarta.interceptor-api-2.2.0.jar
💡 说明:这 3 个 jar 在 Maven 方案(见方案 B)下由 Maven 自动传递下载,只有纯手工 classpath 场景需要手动补装。SE 模式完整运行验证见《构建并运行示例应用指南》篇。
五、方案 B:Maven 依赖引入(开发推荐)
OpenWebBeans 官方推荐通过 Maven/Gradle 以依赖方式引入,便于统一版本、传递依赖与打包。本方案从零创建一个 Maven 工程并验证 OpenWebBeans 可用。
5.1 创建 Maven 工程
mkdir -p /root/owb-demo/src/main/java/demo /root/owb-demo/src/main/resources/META-INF
5.2 编写 pom.xml 并引入依赖
openwebbeans-se 提供 CDI SE 容器与 SeContainerInitializer;CDI 4.1 API(jakarta.enterprise.cdi-api)与 jakarta.inject-api 需显式声明(实测 openwebbeans-se 不传递携带 API 包):
<?xml version="1.0" encoding="UTF-8"?>
<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>demo</groupId>
<artifactId>owb-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<owb.version>4.1.1</owb.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.openwebbeans</groupId>
<artifactId>openwebbeans-se</artifactId>
<version>${owb.version}</version>
</dependency>
<dependency>
<groupId>jakarta.enterprise</groupId>
<artifactId>jakarta.enterprise.cdi-api</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>jakarta.inject</groupId>
<artifactId>jakarta.inject-api</artifactId>
<version>2.0.1</version>
</dependency>
</dependencies>
</project>
⚠️ 注意:
openwebbeans-se、openwebbeans-impl、openwebbeans-spi三个 OpenWebBeans 组件必须同为 4.1.1(由${owb.version}统一)。CDI API 与实现版本要匹配:OWB 4.1.1 对应jakarta.enterprise.cdi-api4.1.0(二进制包api/目录即此版本)。
5.3 编译与验证
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
cd /root/owb-demo
mvn clean compile
实测结果(回显节选):
[INFO] BUILD SUCCESS
Maven 本地仓库 ~/.m2/repository/ 会生成以下依赖:
| Artifact | 作用 |
|---|---|
| openwebbeans-se-4.1.1.jar | CDI SE 容器引导(SeContainerInitializer 实现) |
| openwebbeans-impl-4.1.1.jar | 核心实现 |
| openwebbeans-spi-4.1.1.jar | SPI 接口层 |
| jakarta.enterprise.cdi-api-4.1.0.jar | CDI 标准 API |
| jakarta.inject-api-2.0.1.jar | @Inject 等注入注解 |
| xbean-finder-shaded / xbean-asm9-shaded 5.0.0 | 类扫描与字节码处理 |
实测依赖树(mvn dependency:tree):
demo:owb-demo:jar:1.0-SNAPSHOT
+- org.apache.openwebbeans:openwebbeans-se:jar:4.1.1:compile
| \- org.apache.openwebbeans:openwebbeans-impl:jar:4.1.1:compile
| +- org.apache.openwebbeans:openwebbeans-spi:jar:4.1.1:compile
| +- org.apache.xbean:xbean-finder-shaded:jar:5.0.0:compile
| \- org.apache.xbean:xbean-asm9-shaded:jar:5.0.0:compile
+- jakarta.enterprise:jakarta.enterprise.cdi-api:jar:4.1.0:compile
| +- jakarta.enterprise:jakarta.enterprise.lang-model:jar:4.1.0:compile
| +- jakarta.annotation:jakarta.annotation-api:jar:3.0.0:compile
| +- jakarta.el:jakarta.el-api:jar:6.0.0:compile
| \- jakarta.interceptor:jakarta.interceptor-api:jar:2.2.0:compile
\- jakarta.inject:jakarta.inject-api:jar:2.0.1:compile
六、方案选型对比与建议
| 维度 | 方案 A:二进制分发包 | 方案 B:Maven 依赖 |
|---|---|---|
| 是否需联网 | 需(仅下载时) | 需(Maven 拉依赖) |
| 离线友好度 | 高(拷入分发包即可) | 低(需本地仓库预置) |
| 版本管理 | 手工解压覆盖 | pom 版本号统一 |
| 适合场景 | 内网离线、手工 classpath | 日常开发、工程打包 |
💡 建议:日常开发用方案 B;内网隔离环境或要手工掌控 classpath 用方案 A。
七、配置说明
OpenWebBeans 以 jar 库形态提供,配置分四层:
- 默认配置:
/opt/openwebbeans/config/openwebbeans.properties(方案 A 安装目录内,与 jar 内置的META-INF/openwebbeans/openwebbeans.properties同内容)。 - classpath 覆盖:在应用的
META-INF/openwebbeans/openwebbeans.properties写入覆盖项即可生效。 - 系统属性覆盖:
-Dorg.apache.webbeans.scanner.maxThreads=4优先级高于 classpath 文件。 - 程序化配置:
SeContainerInitializer.addProperty(key, value),优先级最高。
详细参数含义、默认值与生产模板见《Apache OpenWebBeans 4.1.1 配置参数详解》篇。
八、注意事项
⚠️ 注意:
- OpenWebBeans 4.x 使用
jakarta.*包名(CDI 4.0),与旧版javax.*不兼容,选型前确认工程依赖。- JDK 21 为官方支持的最新版本,JDK 11 亦可运行;低于 11 无法运行 4.x。
- 纯手工 classpath 运行时,
SeContainerInitializer依赖openwebbeans-se-4.1.1.jar中的 ServiceLoader 注册(META-INF/services/jakarta.enterprise.inject.se.SeContainerInitializer),缺少该 jar 会报No valid CDI implementation found(实测复现)。
九、常见问题
Q1:java.lang.IllegalStateException: No valid CDI implementation found?
原因:classpath 上没有 OpenWebBeans 的 SE 容器注册。解决:加入 openwebbeans-se-4.1.1.jar(方案 A 场景手工补装;方案 B 场景检查 openwebbeans-se 依赖是否遗漏)。
Q2:编译报 cannot find symbol(SeContainer、@Inject 等)?
原因:缺少 CDI API 或注入 API。openwebbeans-se 不传递携带 API 包,必须显式声明 jakarta.enterprise.cdi-api 与 jakarta.inject-api(见方案 B 5.2)。
Q3:运行时 NoClassDefFoundError: jakarta/interceptor/InvocationContext?
原因:手工 classpath 场景缺少 jakarta.interceptor-api。解决:按方案 A 4.4 补装 jakarta.interceptor-api-2.2.0.jar。
Q4:downloads.apache.org 无法访问怎么办?
可用 Apache 镜像站(如清华 TUNA mirrors.tuna.tsinghua.edu.cn/apache/openwebbeans/)下载同路径文件,或把分发包拷入内网后按方案 A 安装。
十、卸载方式
若仅移除 Maven 依赖:删除 pom.xml 中相关 <dependency> 并删除本地仓库:
rm -rf ~/.m2/repository/org/apache/openwebbeans
rm -rf /root/owb-demo
若同时移除二进制分发包与 JDK:
sudo rm -rf /opt/openwebbeans
sudo apt-get remove -y openjdk-21-jdk-headless maven
sudo apt-get autoremove -y
十一、参考链接
- Apache OpenWebBeans 官方下载目录:
https://downloads.apache.org/openwebbeans/ - OpenWebBeans 官网:
https://openwebbeans.apache.org/ - OpenWebBeans 各版本归档:
https://archive.apache.org/dist/openwebbeans/ - Maven Central:
https://repo1.maven.org/maven2/org/apache/openwebbeans/