Apache DeltaSpike 常用 CLI 命令与工具详解

汇总 Apache DeltaSpike 集成常用命令与工具:Maven 编译打包、exec:java 运行与依赖树导出,以及 BeanProvider、ConfigResolver、MessageContext 等核心类用法。

Apache DeltaSpikeApache DeltaSpike2026/10/11

Apache DeltaSpike 常用 CLI 命令与工具详解

DeltaSpike 以库的形式集成进应用,因此没有独立的命令行程序;日常操作围绕 Maven 构建命令展开,配合 DeltaSpike 提供的核心工具类在代码中调用。本文以实测工程 /root/deltaspike-demo(DeltaSpike 1.9.6 + Weld SE 3.1.9)为背景,给出常用命令与工具类的真实回显。

一、Maven 常用命令

1.1 版本与环境确认

mvn -v

真实回显(Ubuntu 22.04 环境):

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

1.2 编译

cd /root/deltaspike-demo && mvn -B clean compile

-q 静默模式下无输出且退出码为 0 即成功。首次执行会从 Maven Central 下载 DeltaSpike 与 Weld 依赖。

1.3 打包

cd /root/deltaspike-demo && mvn -B clean package

真实回显(节选):

[INFO] Building jar: /root/deltaspike-demo/target/deltaspike-demo-1.0.0.jar
[INFO] BUILD SUCCESS

产物:target/deltaspike-demo-1.0.0.jar。

1.4 运行示例

cd /root/deltaspike-demo && mvn -B exec:java

真实回显(节选):

[DeltaSpike] app.greeting = Hello DeltaSpike
[DeltaSpike] app.name     = Apache DeltaSpike
[DeltaSpike] ConfigResolver app.version = 1.9.6
[DeltaSpike] message = Hello DeltaSpike, Apache DeltaSpike!
[DeltaSpike i18n] Welcome Apache DeltaSpike, running DeltaSpike 1.9.6
[INFO] BUILD SUCCESS

指定其它入口类(pom.xml 中以 ${exec.mainClass} 属性暴露主类):

mvn -B exec:java -Dexec.mainClass=com.example.BootstrapApp

1.5 查看依赖树

cd /root/deltaspike-demo && mvn -B dependency:tree

真实回显(筛选 DeltaSpike 与 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

用于核对实际解析版本、排查依赖冲突。

1.6 导出类路径并直接运行

cd /root/deltaspike-demo
mvn -q -B dependency:build-classpath -Dmdep.outputFile=cp.txt
java -Xmx512m -cp target/classes:$(cat cp.txt) com.example.App

真实回显:

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
[DeltaSpike] message = Hello DeltaSpike, Apache DeltaSpike!
[DeltaSpike i18n] Welcome Apache DeltaSpike, running DeltaSpike 1.9.6
INFO: WELD-ENV-002001: Weld SE container ... shut down

1.7 内存限制

构建与运行示例限制堆内存(256–512MB):

export MAVEN_OPTS="-Xms256m -Xmx512m"
java -Xms256m -Xmx512m -cp target/classes:$(cat cp.txt) com.example.App

二、DeltaSpike 核心工具类速查

2.1 BeanProvider:编程式获取 Bean

org.apache.deltaspike.core.api.provider.BeanProvider 用于在非注入点获取托管 Bean:

GreetingService s = BeanProvider.getContextualReference(GreetingService.class);
List<MyBean> all = BeanProvider.getContextualReferences(MyBean.class, true);
DependentProvider<Foo> dp = BeanProvider.getDependent(Foo.class);
  • getContextualReference(Class, Annotation...):按类型(可带限定符)取一个实例。
  • getContextualReference(Class, boolean nullable, Annotation...):nullable=false 时无匹配则抛异常。
  • injectFields(Object):对已有对象执行字段注入。

2.2 ConfigResolver:配置取值

org.apache.deltaspike.core.api.config.ConfigResolver 提供编程式配置访问:

String v = ConfigResolver.getPropertyValue("app.version");
String d = ConfigResolver.getPropertyValue("app.version", "unknown");
for (ConfigSource cs : ConfigResolver.getConfigSources()) { /* 查看优先级 */ }

配合 deltaspike.config.log=true 可在启动时打印全部配置源与已解析值。

2.3 MessageContext:国际化消息

org.apache.deltaspike.core.api.message.MessageContext 可注入或克隆使用:

@Inject
private MessageContext messageContext;

String msg = messageContext.message()
        .template("Welcome %s")
        .argument("DeltaSpike")
        .toString();

默认插值器按 %s 风格(String.format)解析;可通过 messageResolver(...) 替换消息解析器,通过 messageSource(...) 指定资源基名。

2.4 @Transactional:事务边界

org.apache.deltaspike.jpa.api.transaction.Transactional 用于声明事务方法(需引入 JPA 模块):

import org.apache.deltaspike.jpa.api.transaction.Transactional;

@Transactional
public void createUser(User user) {
    userRepository.save(user);
}

2.5 运行时引导:CdiContainerLoader 与 CdiContainer

DeltaSpike 提供轻量运行时引导 API(源自 org.apache.deltaspike.cdise.api):

CdiContainer cdiContainer = CdiContainerLoader.getCdiContainer();
cdiContainer.boot();
try {
    BeanProvider.getContextualReference(GreetingService.class).run();
} finally {
    cdiContainer.shutdown();
}

真实回显:

[DeltaSpike] CdiContainer impl = org.apache.deltaspike.cdise.weld.WeldContainerControl

2.6 其它常用注解与类型

类型全限定名用途
@DeltaSpikeorg.apache.deltaspike.core.api.common.DeltaSpike内置限定符(marker)
@ConfigPropertyorg.apache.deltaspike.core.api.config.ConfigProperty配置注入
@Repositoryorg.apache.deltaspike.data.api.RepositoryJPA 仓储接口
DependentProviderorg.apache.deltaspike.core.api.provider.DependentProvider依赖对象生命周期管理

三、工具类组合示例

在 Weld SE 引导下组合配置与消息:

Weld weld = new Weld();
WeldContainer container = weld.initialize();
try {
    GreetingService greeting = BeanProvider.getContextualReference(GreetingService.class);
    greeting.run();
    I18nService i18n = BeanProvider.getContextualReference(I18nService.class);
    i18n.run();
} finally {
    container.shutdown();
}

运行输出即前文 mvn exec:java 的回显,说明 BeanProvider + ConfigResolver + MessageContext 组合工作正常。

四、常见命令问题

Q1:mvn exec:java 报找不到主类?

确认 pom.xml 中 exec-maven-plugin 配置了 <mainClass>${exec.mainClass}</mainClass>,并通过 -Dexec.mainClass=全限定类名 指定入口。

Q2:dependency:build-classpath 生成的类路径里没有 DeltaSpike?

确认对应依赖 scope 为 compile 或 runtime;deltaspike-core-impl 常声明为 runtime,运行期才需要。

Q3:命令回显出现大量 WELD-001478 告警?

属 Weld 对内置拦截器优先级的提示,与命令执行结果无关,可忽略。

Q4:如何控制构建/运行内存?

MAVEN_OPTS="-Xms256m -Xmx512m" 控制 Maven 进程,java -Xmx512m 控制应用进程,取值限定在 256–512MB。