jcasbin 1.99.0 常用 CLI 命令与工具详解

jcasbin 1.99.0 常用 CLI 命令与工具详解:Maven Central 版本查询、jar/javap 结构与 API 检视、mvn 全套命令、java -cp 直跑、jshell 交互验证与 FilteredAdapter 实测。

Apache CasbinCasbin2026/10/13

jcasbin 1.99.0 常用 CLI 命令与工具详解

目标:jcasbin 是纯 Java 库、无官方 CLI,本篇给出围绕它的完整命令行工具链——版本查询、jar 结构与 API 检视、Maven 全套命令、java -cp 直跑、jshell 交互验证,全部命令在 Ubuntu 22.04(OpenJDK 11 + Maven 3.6.3,jcasbin 1.99.0)实测通过。

一、工具链定位

工具用途本篇章节
curl查 Maven Central 最新版本二
jar / javap检视 jar 结构与方法签名三
mvn依赖管理、编译、运行四
java -cp无 Maven 直跑五
jshell交互式验证 API(JDK 9+)六

模型策略的在线验证另有官方编辑器 https://editor.casbin.org/(网页工具,不在本篇命令行范围)。

二、版本查询:curl 核对 Maven Central

curl -s https://repo1.maven.org/maven2/org/casbin/jcasbin/maven-metadata.xml | grep -E '<latest>|<release>'

回显(实测):

    <latest>1.100.0-snapshot.3</latest>
    <release>1.100.0-snapshot.3</release>
curl -s https://repo1.maven.org/maven2/org/casbin/jcasbin/maven-metadata.xml | grep '<version>' | tail -8

回显(实测):

      <version>1.95.0</version>
      <version>1.96.0</version>
      <version>1.97.0</version>
      <version>1.98.0</version>
      <version>1.99.0</version>
      <version>1.100.0-snapshot.1</version>
      <version>1.100.0-snapshot.2</version>
      <version>1.100.0-snapshot.3</version>

注意:<latest> 的 1.100.0-snapshot.x 是快照版;生产用最新稳定版 1.99.0。直接下载主 jar 也可:curl -sO https://repo1.maven.org/maven2/org/casbin/jcasbin/1.99.0/jcasbin-1.99.0.jar(记得带全依赖,见第五节)。

三、jar 结构与 API 检视:jar / javap

先看包结构,建立"什么需求找哪个类"的映射:

jar tf ~/.m2/repository/org/casbin/jcasbin/1.99.0/jcasbin-1.99.0.jar | grep -E 'main|persist|util/' | head -12

回显(实测):

org/casbin/jcasbin/main/CoreEnforcer.class
org/casbin/jcasbin/main/Enforcer.class
org/casbin/jcasbin/main/ManagementEnforcer.class
org/casbin/jcasbin/main/SyncedEnforcer.class
org/casbin/jcasbin/persist/Adapter.class
org/casbin/jcasbin/persist/file_adapter/FilteredAdapter.class
org/casbin/jcasbin/persist/file_adapter/FileAdapter.class
org/casbin/jcasbin/util/BuiltInFunctions.class
org/casbin/jcasbin/util/Util.class
包代表类用途
mainEnforcer / SyncedEnforcer决策入口与策略管理(Synced 为线程安全版)
modelModel模型对象(可从文件/字符串构建)
persistFileAdapter / FilteredAdapter策略文件加载与回写、过滤加载
utilBuiltInFunctionskeyMatch 等内置匹配函数(静态方法)

javap 检视 Enforcer 构造器与内置函数签名:

javap -cp ~/.m2/repository/org/casbin/jcasbin/1.99.0/jcasbin-1.99.0.jar org.casbin.jcasbin.main.Enforcer | grep 'public org.casbin.jcasbin.main.Enforcer' | head -4

回显(实测):

public org.casbin.jcasbin.main.Enforcer();
public org.casbin.jcasbin.main.Enforcer(java.lang.String, java.lang.String);
public org.casbin.jcasbin.main.Enforcer(java.lang.String, org.casbin.jcasbin.persist.Adapter);
public org.casbin.jcasbin.main.Enforcer(org.casbin.jcasbin.model.Model, org.casbin.jcasbin.persist.Adapter);
javap -cp 'target/dependency/*' org.casbin.jcasbin.util.BuiltInFunctions | grep -E 'static boolean'

回显(实测):

  public static boolean keyMatch(java.lang.String, java.lang.String);
  public static boolean keyMatch2(java.lang.String, java.lang.String);
  public static boolean keyMatch3(java.lang.String, java.lang.String);
  public static boolean keyMatch4(java.lang.String, java.lang.String);
  public static boolean keyMatch5(java.lang.String, java.lang.String);
  public static boolean regexMatch(java.lang.String, java.lang.String);
  public static boolean ipMatch(java.lang.String, java.lang.String);
  public static boolean globMatch(java.lang.String, java.lang.String);
  public static boolean allMatch(java.lang.String, java.lang.String);

提示:内置函数只在这个类里,1.99.0 的 Util 类没有 keyMatch 系列(仅 hasEval 等),javap 一验便知,避免踩编译坑。

字节码版本核验(确认最低 JDK):

javap -verbose -cp ~/.m2/repository/org/casbin/jcasbin/1.99.0/jcasbin-1.99.0.jar org.casbin.jcasbin.main.Enforcer | grep major

回显(实测):major version: 52(= Java 8)。

四、Maven 常用命令

# 依赖树:确认传递依赖构成(实测节选)
mvn dependency:tree | grep -E 'jcasbin|aviator|csv|ipaddress|slf4j-api'

回显(实测):

[INFO] +- org.casbin:jcasbin:jar:1.99.0:compile
[INFO] |  +- org.slf4j:slf4j-api:jar:2.0.16:compile
[INFO] |  +- io.github.aviatorscript:aviator:jar:5.9.0:compile
[INFO] |  +- com.github.seancfoley:ipaddress:jar:5.5.1:compile
[INFO] |  +- org.apache.commons:commons-csv:jar:1.12.0:compile
# 导出全量依赖 jar(手动部署/免 Maven 运行的前提)
mvn dependency:copy-dependencies -DoutputDirectory=target/dependency

# 编译与运行指定演示类
mvn -q compile
mvn -q exec:java -Dexec.mainClass=demo.CasbinDemo

回显(实测,exec:java):

alice, data1, read => true
alice, data1, write => false
bob, data2, write => true
bob, data2, read => false
[after addPolicy] alice, data2, write => true

陷阱(实测):pom 中固定 <mainClass> 后,命令行 -Dexec.mainClass 会被覆盖——pom 不要写死 mainClass,用命令行切换多演示类。

五、java -cp 直跑(免 Maven)

cd /root/casbin-demo && java -cp 'target/classes:target/dependency/*' demo.CasbinDemo | head -4

回显(实测):

alice, data1, read => true
alice, data1, write => false
bob, data2, write => true
bob, data2, read => false

要点:target/dependency/* 必须带上(jcasbin 有 aviator/commons-csv 等 13 个传递依赖);策略/模型文件按工作目录相对路径解析,须从工程根目录运行。

六、jshell 交互验证(JDK 9+)

把五组 API 验证写成脚本 api.jsh(用显式 println 输出,避免 jshell 回显被偏好设置抑制),一行命令跑通:

cd /root/casbin-demo && jshell --class-path 'target/classes:target/dependency/*' api.jsh

回显(实测,节选):

== 1. Management API ==
addPolicy(cathy,data1,read) => true
hasPolicy(cathy,data1,read) => true
updatePolicy([cathy,data1,read]->[cathy,data1,write]) => true
getFilteredPolicy(1,data1) => [[alice, data1, read], [cathy, data1, write]]
== 2. RBAC API ==
addRoleForUser(alice,data2_admin) => true
getRolesForUser(alice) => [data2_admin]
getImplicitRolesForUser(alice) => [data2_admin, senior_admin]
getImplicitUsersForRole(senior_admin) => [data2_admin, alice]
== 3. autoSave switch ==
addPolicy(dave,data3,read) with autoSave off => true
policy_auto.csv before savePolicy => []
policy_auto.csv after savePolicy => [p, dave, data3, read]
== 4. Model from string ==
enforce(alice,data1,read) with string model => true
== 5. FilteredAdapter ==
getPolicy() after filtered load => [[admin, domain1, data1, read], [admin, domain1, data1, write]]
isFiltered() => true

jshell 是验证"单 API 行为"的最快路径:无需建类、无需编译,改一行重跑即得结论。

七、注意事项

  • 版本核对只认 <version> 列表里的非 snapshot 最新项;snapshot 不建议生产使用。
  • 手动部署必须带全依赖 jar(第五节清单),仅主 jar 会 NoClassDefFoundError。
  • jshell 需 JDK 9+;JDK 8 环境用 javac + java -cp 等价验证。
  • jshell 中动态加的策略默认 autoSave 会写盘,演示前备份 policy.csv,或脚本里先 enableAutoSave(false)。
  • FilteredAdapter 加载后 enforcer 处于"过滤态"(isFiltered()=true),此时不可 savePolicy。

八、参考链接

  1. jcasbin 官方仓库:https://github.com/casbin/jcasbin
  2. Maven 中央仓库 jcasbin:https://mvnrepository.com/artifact/org.casbin/jcasbin
  3. exec-maven-plugin 用法:https://www.mojohaus.org/exec-maven-plugin/
  4. JShell 用户指南:https://docs.oracle.com/en/java/javase/11/jshell/
  5. Casbin 在线编辑器:https://editor.casbin.org/