Apache DeltaSpike 常用 CLI 命令与工具详解
汇总 Apache DeltaSpike 集成常用命令与工具:Maven 编译打包、exec:java 运行与依赖树导出,以及 BeanProvider、ConfigResolver、MessageContext 等核心类用法。
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 其它常用注解与类型
| 类型 | 全限定名 | 用途 |
|---|---|---|
| @DeltaSpike | org.apache.deltaspike.core.api.common.DeltaSpike | 内置限定符(marker) |
| @ConfigProperty | org.apache.deltaspike.core.api.config.ConfigProperty | 配置注入 |
| @Repository | org.apache.deltaspike.data.api.Repository | JPA 仓储接口 |
| DependentProvider | org.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。