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

BVal 无自带 CLI,实测其工具链:java -jar 自报版本、jar/javap 透视 SPI 与签名、Maven 依赖命令、双 jar 直跑与 sha1 校验,全部实测。

Apache BValBVal2026/10/13

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

Apache BVal 是纯 Java 类库,没有自带 CLI 工具(无 bval 可执行文件、无 shell 脚本)。本篇实测与 BVal 相关的完整命令行工具链:java -jar 自报版本、jar/javap 透视类库、Maven 依赖与运行命令、最小 classpath 直跑、sha1 校验,以及系统工具的配合使用。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS,x86_64;OpenJDK 17.0.20.1;Apache Maven 3.6.3
  • 组件版本:bval-jsr 3.0.2、bval-extras 3.0.2、jakarta.validation-api 3.0.2
  • 本地仓库:/root/.m2/repository(下文简写 $M2)
  • 实验工程:/opt/bval-demo(pom 与源码见《Ubuntu 22.04 安装 Apache BVal 指南》)

二、工具概览

工具角色BVal 相关用法
java -jar版本自报bval-jsr 内置 Main-Class,直接打印版本信息
jar tf / jar xf透视/解包 jar查 SPI 注册、消息文件、MANIFEST 版本
javap反汇编类签名看 Provider/配置类/约束注解的真实 API
mvn依赖与构建dependency:get/tree、compile、exec:java
javac / java -cp脱构建工具直跑双 jar 最小 classpath
sha1sum完整性校验校验 Central 下载的 jar

BVal 发行物只有 jar(Maven Central),无任何命令行程序;「CLI 使用 BVal」即「用命令行工具编译、透视、运行含 BVal 的程序」。

三、前置条件

ls $M2/org/apache/bval/bval-jsr/3.0.2/bval-jsr-3.0.2.jar

回显(实测):

/root/.m2/repository/org/apache/bval/bval-jsr/3.0.2/bval-jsr-3.0.2.jar

jar 在本地仓库即可(dependency:get 或工程编译拉取均可获取,见第六节)。

四、java -jar:版本自报

bval-jsr 的 MANIFEST 带 Main-Class: org.apache.bval.util.BValVersion,可直接运行:

java -jar $M2/org/apache/bval/bval-jsr/3.0.2/bval-jsr-3.0.2.jar

回显(实测):

Project: Apache BVal
Version: 3.0.2
Revision: unknown

os.name: Linux
os.version: 6.8.0-138-generic

排查「环境里到底是哪个版本」时这条最直接,比解包看 MANIFEST 快。

五、jar 与 javap:透视类库

5.1 jar tf:SPI 注册文件(Provider 自动发现机制)

jar tf $M2/org/apache/bval/bval-jsr/3.0.2/bval-jsr-3.0.2.jar | grep services

回显(实测):

META-INF/services/
META-INF/services/jakarta.enterprise.inject.spi.Extension
META-INF/services/jakarta.validation.spi.ValidationProvider
META-INF/services/org.apache.bval.jsr.metadata.MetadataSource

三个 SPI 文件分别是:Jakarta Validation Provider 注册(buildDefaultValidatorFactory() 自动发现的依据)、CDI 扩展、元数据源扩展。查看注册内容:

cd /tmp && jar xf $M2/org/apache/bval/bval-jsr/3.0.2/bval-jsr-3.0.2.jar META-INF/services/jakarta.validation.spi.ValidationProvider && cat META-INF/services/jakarta.validation.spi.ValidationProvider

回显(实测):

org.apache.bval.jsr.ApacheValidationProvider

对照 javax 时代的 2.0.6(多版本共存场景,实测 jar tf 确认):其服务文件名为 META-INF/services/javax.validation.spi.ValidationProvider——这就是 3.0.x(jakarta)与 2.0.x(javax)互不兼容的机制根源。

5.2 jar xf + grep:核对实现版本

cd /tmp && jar xf $M2/org/apache/bval/bval-jsr/3.0.2/bval-jsr-3.0.2.jar META-INF/MANIFEST.MF && grep -E "Specification-|Implementation-" META-INF/MANIFEST.MF

回显(实测):

Specification-Title: Jakarta Bean Validation
Specification-Version: 3.0
Implementation-Title: Apache BVal :: Implementation
Implementation-Version: 3.0.2
Build-Jdk-Spec: 11

Build-Jdk-Spec: 11 即运行底线(Java 11+),规范版本 3.0。

5.3 javap:配置类真实签名

javap -classpath $M2/org/apache/bval/bval-jsr/3.0.2/bval-jsr-3.0.2.jar org.apache.bval.jsr.ApacheValidationProvider | head -7

回显(实测):

public class org.apache.bval.jsr.ApacheValidationProvider implements jakarta.validation.spi.ValidationProvider<org.apache.bval.jsr.ApacheValidatorConfiguration> {
  public org.apache.bval.jsr.ApacheValidationProvider();
  public boolean isSuitable(java.lang.Class<? extends jakarta.validation.Configuration<?>>);
  public org.apache.bval.jsr.ApacheValidatorConfiguration createSpecializedConfiguration(jakarta.validation.spi.BootstrapState);
  public jakarta.validation.Configuration<?> createGenericConfiguration(jakarta.validation.spi.BootstrapState);
  public jakarta.validation.ValidatorFactory buildValidatorFactory(jakarta.validation.spi.ConfigurationState);

确认 Provider 实现的是 jakarta.validation.spi.ValidationProvider(3.x 命名空间),配置工厂方法与规范 SPI 一一对应。

javap -classpath $M2/org/apache/bval/bval-jsr/3.0.2/bval-jsr-3.0.2.jar org.apache.bval.jsr.ConfigurationImpl | grep -c "public"

回显(实测):

18

ConfigurationImpl 共 18 个 public 成员,即 BVal 的全部可编程配置入口(方法明细见《Apache BVal 配置参数详解》3.1 节)。

5.4 javap -v:约束注解的属性与绑定

javap -classpath $M2/jakarta/validation/jakarta.validation-api/3.0.2/jakarta.validation-api-3.0.2.jar jakarta.validation.constraints.Size

回显(实测):

public interface jakarta.validation.constraints.Size extends java.lang.annotation.Annotation {
  public abstract java.lang.String message();
  public abstract java.lang.Class<?>[] groups();
  public abstract java.lang.Class<? extends jakarta.validation.Payload>[] payload();
  public abstract int min();
  public abstract int max();

约束注解的标准三件套(message/groups/payload)加自身属性(min/max),排查「注解有哪些可配参数」时用。

5.5 jar tf:bval-extras 约束清单

jar tf $M2/org/apache/bval/bval-extras/3.0.2/bval-extras-3.0.2.jar | grep "Constraint.class$" | sed "s#org/apache/bval/extras/constraints/##;s#Constraint.class##;s#/#.#g" | sort

回显(实测):

checkdigit.ABANumber
checkdigit.CUSIP
checkdigit.EAN13
checkdigit.IBAN
checkdigit.ISBN10
checkdigit.Luhn
checkdigit.Sedol
checkdigit.Verhoeff
creditcard.AmericanExpress
creditcard.Diners
creditcard.Discover
creditcard.Mastercard
creditcard.Visa
file.Directory
file.NotDirectory
file.Symlink
net.Domain
net.InetAddress

18 个扩展约束注解一目了然(用途表见《Apache BVal 配置参数详解》7.1 节)。

六、Maven 工具链命令

6.1 离线取 jar:dependency:get

mvn -q dependency:get -Dartifact=org.apache.bval:bval-extras:3.0.2 && ls $M2/org/apache/bval/bval-extras/

回显(实测):

3.0.2

不需要工程,任意目录执行即可把指定坐标拉进本地仓库。

6.2 依赖树:dependency:tree

cd /opt/bval-demo && mvn dependency:tree -DoutputFile=/tmp/tree.txt >/dev/null 2>&1; cat /tmp/tree.txt

回显(实测):

demo:bval-demo:jar:1.0.0
+- org.apache.bval:bval-jsr:jar:3.0.2:compile
+- org.apache.bval:bval-extras:jar:3.0.2:compile
\- jakarta.validation:jakarta.validation-api:jar:3.0.2:compile

排查版本冲突/命名空间混用(javax 与 jakarta)的第一命令。

6.3 编译与运行:compile + exec:java

cd /opt/bval-demo && LANG=C.UTF-8 JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 mvn -q compile exec:java -Dexec.mainClass=demo.BvalDemo 2>/dev/null | head -5

回显(实测):

ValidatorFactory 实现类: org.apache.bval.jsr.ApacheValidatorFactory
非法对象约束违反数: 4
  [email] 邮箱格式不合法 | 无效值 = not-an-email
  [username] 用户名长度须在 3-20 之间 | 无效值 = ab
  [age] 年龄不能小于 18 | 无效值 = 15

exec:java 在同一 JVM 内运行主类,注意该插件(3.6.4)要求 Maven 3.6.3+,老 Maven 会兼容性报错——CentOS 8 自带 Maven 3.5.4 建议改用下一节的双 jar 直跑。

七、javac 与 java -cp:脱构建工具直跑

最小运行 classpath 只需双 jar(bval-jsr 实现本体 + jakarta.validation-api 规范 API):

mkdir -p /tmp/bm/classes && javac -encoding UTF-8 -cp $M2/jakarta/validation/jakarta.validation-api/3.0.2/jakarta.validation-api-3.0.2.jar -d /tmp/bm/classes /opt/bval-demo/src/main/java/demo/BvalDemo.java && LANG=C.UTF-8 java -Dfile.encoding=UTF-8 -cp "/tmp/bm/classes:$M2/org/apache/bval/bval-jsr/3.0.2/bval-jsr-3.0.2.jar:$M2/jakarta/validation/jakarta.validation-api/3.0.2/jakarta.validation-api-3.0.2.jar" demo.BvalDemo

回显(实测):

ValidatorFactory 实现类: org.apache.bval.jsr.ApacheValidatorFactory
非法对象约束违反数: 4
  [age] 年龄不能小于 18 | 无效值 = 15
  [username] 用户名长度须在 3-20 之间 | 无效值 = ab
  [phone] 手机号格式不合法 | 无效值 = 12345
  [email] 邮箱格式不合法 | 无效值 = not-an-email
合法对象约束违反数: 0

注意分工:javac 只需规范 API jar(注解/接口);运行时才需要实现 jar(SPI 自动发现)。bval-extras 不在 classpath 时普通约束照常工作,只有使用其注解才需要(约 42 KB)。违反条目顺序为 Set 无序输出,每次运行可能不同。

八、sha1sum:完整性校验

cd /tmp/bm/lib 2>/dev/null || { mkdir -p /tmp/bm/lib && cd /tmp/bm/lib; }; cp $M2/org/apache/bval/bval-jsr/3.0.2/bval-jsr-3.0.2.jar . && curl -s https://repo1.maven.org/maven2/org/apache/bval/bval-jsr/3.0.2/bval-jsr-3.0.2.jar.sha1 -o bval-jsr-3.0.2.jar.sha1 && cat bval-jsr-3.0.2.jar.sha1

回显(实测):

111d95c4f7c52f2a54dcb65bb0843e0026979ae6

Central 的 .sha1 是裸哈希,直接 -c 会报格式错误(实测 no properly formatted SHA1 checksum lines found),拼行后校验:

cd /tmp/bm/lib && printf '%s  %s\n' "$(cat bval-jsr-3.0.2.jar.sha1)" bval-jsr-3.0.2.jar | sha1sum -c -

回显(实测):

bval-jsr-3.0.2.jar: OK

OK 即与 Central 官方哈希一致。BVal 无 .sha512(实测 404),校验文件只有 .sha1。

九、注意事项

  1. 无自带 CLI:不要找 bval 命令;版本自报用 java -jar bval-jsr-3.0.2.jar(第四节)。
  2. 命名空间版本严格对应:3.0.x 配 jakarta.validation-api、SPI 文件 jakarta.validation.spi.*;2.0.x 配 validation-api(javax)、SPI 文件 javax.validation.spi.*,混用必失败。
  3. exec 插件版本门槛:exec:java 3.6.4 需 Maven 3.6.3+;Maven 3.5.x 环境用 java -cp 直跑替代。
  4. 编码:命令行默认 locale 为 POSIX 时中文消息输出问号,统一 LANG=C.UTF-8 + -Dfile.encoding=UTF-8。
  5. Set 无序:校验违反输出顺序不稳定,脚本比对输出时先排序。

十、常见问题(FAQ)

Q1:java -jar 能直接跑我的校验程序吗? 不能,BVal 不是可执行应用。java -jar 仅适用于 MANIFEST 带 Main-Class 的 bval-jsr 本身(版本自报);自己的程序用 java -cp 或打包后运行。

Q2:双 jar 直跑报 ValidationException: No validator provider found? classpath 少了 bval-jsr-3.0.2.jar(只有规范 API 时无 SPI 文件可发现)。确认 -cp 双 jar 齐全。

Q3:javap 报 Error: class not found? javap 只认 classpath 上真实存在的类。约束注解在 jakarta.validation-api jar,实现在 bval-jsr jar,先确认目标类属于哪个 jar(jar tf 查)再给对 classpath。

Q4:dependency:get 拉不下来? 先探测网络(curl -sI https://repo1.maven.org/maven2/org/apache/bval/bval-jsr/3.0.2/bval-jsr-3.0.2.jar | head -1 应返回 HTTP/2 200),慢/超时可换国内镜像或直接 wget 双 jar(见《Ubuntu 22.04 安装 Apache BVal 指南》方案 B)。

十一、参考链接

  1. Apache BVal 项目主页:https://bval.apache.org/
  2. Maven 中央仓库 bval-jsr:https://repo1.maven.org/maven2/org/apache/bval/bval-jsr/
  3. Maven exec 插件:https://maven.apache.org/plugins/maven-exec-plugin/
  4. Jakarta Bean Validation 3.0 规范:https://jakarta.ee/specifications/bean-validation/3.0/