jcasbin 1.99.0 常用 CLI 命令与工具详解
jcasbin 1.99.0 常用 CLI 命令与工具详解:Maven Central 版本查询、jar/javap 结构与 API 检视、mvn 全套命令、java -cp 直跑、jshell 交互验证与 FilteredAdapter 实测。
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
| 包 | 代表类 | 用途 |
|---|---|---|
| main | Enforcer / SyncedEnforcer | 决策入口与策略管理(Synced 为线程安全版) |
| model | Model | 模型对象(可从文件/字符串构建) |
| persist | FileAdapter / FilteredAdapter | 策略文件加载与回写、过滤加载 |
| util | BuiltInFunctions | keyMatch 等内置匹配函数(静态方法) |
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。
八、参考链接
- jcasbin 官方仓库:https://github.com/casbin/jcasbin
- Maven 中央仓库 jcasbin:https://mvnrepository.com/artifact/org.casbin/jcasbin
- exec-maven-plugin 用法:https://www.mojohaus.org/exec-maven-plugin/
- JShell 用户指南:https://docs.oracle.com/en/java/javase/11/jshell/
- Casbin 在线编辑器:https://editor.casbin.org/