Ubuntu 22.04 安装 Apache Commons JCS 指南
在 Ubuntu 22.04 上从零接入 Apache Commons JCS 3.2.1:Maven 在线依赖、官方二进制包离线安装与源码编译三套方案,附 cache.ccf 缺失 NPE、无传递依赖等真实回显与排查。
Ubuntu 22.04 安装 Apache Commons JCS 指南
目标:在 Ubuntu 22.04 上从零搭建 Apache Commons JCS 3.2.1 的使用环境,完成 JDK 17 + Maven 环境确认、三种依赖获取方式(Maven 在线依赖、官方二进制包、源码编译)与真实缓存读写验证。以下全部命令与回显均已在 Ubuntu 22.04(x86_64)实测通过。
一、环境信息
本节先固定本次实测所用软硬件基线,便于读者逐项对照复现。
- 操作系统:Ubuntu 22.04(x86_64)
- JDK:OpenJDK 17.0.20.1(
java -version实测,回显见 4.2) - 构建工具:Apache Maven 3.6.3(
mvn -v实测,回显见 4.2) - 目标库:Apache Commons JCS 3.2.1(Maven 坐标
org.apache.commons:commons-jcs3-core:3.2.1) - 依赖来源:
https://repo.maven.apache.org/maven2/(Maven 中央仓库,网络直连可达) - 官方发行目录:
https://downloads.apache.org/commons/jcs/ - Maven 示例工程目录:
/opt/jcs-demo - 官方二进制包解压目录:
/opt/jcs3-dist - 官方源码包解压目录:
/opt/jcs3-src - 二进制包演示目录:
/opt/jcs-dist-demo - 磁盘缓存数据目录:
/opt/jcs-demo/disk-cache
Commons JCS 是纯 Java 进程内缓存库(Java In-Memory Cache),以 jar 形式嵌入应用,无独立守护进程、无端口,安装本质上是「让应用能拿到 jar 并提供配置文件」。
二、前置条件
在开始安装前,请确认以下条件满足,否则后续步骤会因权限或网络问题中断。
- root 权限或 sudo:需要在
/opt下创建目录并写入文件。 - 网络可达:需要访问
repo.maven.apache.org(Maven 中央仓库)与downloads.apache.org(官方二进制/源码包);第四、五、六章的下载与构建命令本身就是连通性的实测验证。 - 磁盘空间:官方二进制包实测 7,837,164 字节、源码包实测 824,939 字节,加上 Maven 本地仓库缓存建议预留 ≥ 300 MB。
- JDK 与 Maven 已就绪:本文统一使用 JDK 17(回显验证见 4.2)。若系统未装,先执行
apt-get install -y openjdk-17-jdk maven安装。
三、版本选型说明
Commons JCS 是 Apache 基金会的 Java 分布式/进程内缓存组件。安装前先确认版本与模块构成,避免引错坐标。当前 3.x 发行线包含 3.0、3.1、3.2 与 3.2.1,本文实测 3.2.1(当前最新正式版),版本选型建议如下:
| 版本 | 说明 | 建议 |
|---|---|---|
| 3.2.1 | 3.2 线的最新补丁版,本文实测版本 | 生产环境首选 |
| 3.2 | 3.2 线首发版 | 与 3.2.1 同线,建议直接用 3.2.1 |
| 3.1 / 3.0 | 历史版本线 | 存量系统兼容时使用,新项目不建议 |
坐标与版本的实测确认:引入依赖后用 mvn dependency:list 列出解析结果(完整命令与回显见《Apache Commons JCS 3.2.1 常用 API 与工具详解》5.3 节,本文 4.3 节的 dependency:get 回显中也能直接看到 commons-jcs3-core-3.2.1.jar 的下载记录)。
3.2.1 官方发行包(commons-jcs3-dist-3.2.1-bin.tar.gz)包含 5 个模块,模块构成与用途:
| 模块 | 用途 |
|---|---|
| commons-jcs-core | 核心模块:内存/磁盘缓存、配置加载,绝大多数场景只需它 |
| commons-jcs-jcache | JCache(JSR-107)标准 API 实现(含 cdi 与 nocdi 两种 jar) |
| commons-jcs-jcache-extras | JCache 扩展 |
| commons-jcs-jcache-openjpa | OpenJPA 二级缓存适配 |
| commons-jcs-tck-tests | JCache TCK 一致性测试包 |
💡 技术拓展:Java 缓存方案不止本文所用的 Apache Commons JCS。常见选项对比——
方案 形态 特点 适用场景 Apache Commons JCS 进程内 Java 库 Apache 出品、内存+磁盘分层、可配 LRU 淘汰、支持 JCache 标准 嵌入应用的本地缓存、需磁盘持久化 Ehcache 进程内 Java 库 功能全、堆外缓存与 Terracotta 集群能力强 Spring 生态本地缓存 Caffeine 进程内 Java 库 基于 W-TinyLFU、内存命中率与性能最优、仅内存 纯内存高性能缓存 Redis(Jedis/Lettuce 客户端) 独立缓存服务 跨进程共享、数据结构丰富、需运维服务端 多实例共享数据、分布式场景 Infinispan 嵌入式/服务端混合 数据网格、分布式模式、跨节点复制 大规模数据网格与集群 本文场景为 Java 应用进程内的内存+磁盘两级缓存(含重启后数据恢复),选用 Commons JCS:它零外部依赖、经 Maven 即可引入、磁盘缓存可跨进程重启持久化,且无传递依赖、部署极轻。
四、在线安装方案(A:Maven 依赖引入)
官方推荐方式:通过 Maven 引入 commons-jcs3-core 依赖,由构建工具自动解析。适合可联网的开发/构建环境。
4.1 方案说明与适用场景
本方案先确认 JDK 与 Maven 环境,再创建一个最小 Maven 工程引入 commons-jcs3-core:3.2.1,最后编译运行一个真实的缓存读写程序验证。适合持续集成与可访问中央仓库的场景。
4.2 确认 JDK 17 与 Maven
先确认 JDK 版本(JCS 3.2.1 的依赖以 JDK 17 环境实测):
java -version
输出:
openjdk version "17.0.20.1" 2026-08-18
OpenJDK Runtime Environment (build 17.0.20.1+1-1-22.04-Ubuntu)
OpenJDK 64-Bit Server VM (build 17.0.20.1+1-1-22.04-Ubuntu, mixed mode, sharing)
再确认 Maven 及其使用的 JDK:
mvn -v
输出:
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 17.0.20.1, vendor: Ubuntu, runtime: /usr/lib/jvm/java-17-openjdk-amd64
Default locale: en_US, platform encoding: ANSI_X3.4-1968
OS name: "linux", version: "6.8.0-138-generic", arch: "amd64", family: "unix"
关键点:Java version: 17.0.20.1 说明 Maven 已使用 JDK 17,Ubuntu 下系统 Maven 自动跟随 java 解析结果,无需设置 JAVA_HOME。注意 platform encoding: ANSI_X3.4-1968——本环境默认编码为 ASCII,后文运行含中文输出的程序时需加 -Dfile.encoding=UTF-8(见 4.6)。
4.3 创建 Maven 工程并引入依赖
创建工程目录:
mkdir -p /opt/jcs-demo/src/main/java/demo /opt/jcs-demo/conf
/opt/jcs-demo/pom.xml 内容:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>demo</groupId>
<artifactId>jcs-demo</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.release>17</maven.compiler.release>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-jcs3-core</artifactId>
<version>3.2.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<release>17</release>
</configuration>
</plugin>
</plugins>
</build>
</project>
逐项说明:maven.compiler.release=17 与 compiler 插件 <release>17</release> 指定按 JDK 17 编译;project.build.sourceEncoding=UTF-8 保证含中文注释的源码正常编译;dependencies 仅声明 commons-jcs3-core:3.2.1 一个依赖。
从中央仓库预拉取该构件(首次下载,网络直连较慢,实测约 3 分钟):
cd /opt/jcs-demo && mvn -B dependency:get -Dartifact=org.apache.commons:commons-jcs3-core:3.2.1
输出节选(实测末尾 12 行):
[INFO] Downloading from central: https://repo.maven.apache.org/maven2/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar
[INFO] Downloaded from central: https://repo.maven.apache.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar (385 kB at 520 kB/s)
[INFO] Downloaded from central: https://repo.maven.apache.org/maven2/hsqldb/hsqldb/1.8.0.10/hsqldb-1.8.0.10.jar (707 kB at 666 kB/s)
[INFO] Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-collections4/4.4/commons-collections4-4.4.jar (752 kB at 709 kB/s)
[INFO] Downloaded from central: https://repo.maven.apache.org/maven2/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar (123 kB at 60 kB/s)
[INFO] Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-jcs3-core/3.2.1/commons-jcs3-core-3.2.1.jar (547 kB at 37 kB/s)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:54 min
[INFO] Finished at: 2026-10-14T10:22:06Z
[INFO] ------------------------------------------------------------------------
验证依赖解析结果(确认坐标与版本正确进入工程):
cd /opt/jcs-demo && mvn -B dependency:tree
输出节选(实测):
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ jcs-demo ---
[INFO] demo:jcs-demo:jar:1.0.0
[INFO] \- org.apache.commons:commons-jcs3-core:jar:3.2.1:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
💡 说明:依赖树里只有
commons-jcs3-core自己——它没有 compile 范围的传递依赖,运行时 classpath 只需 core jar 一个文件。dependency:get过程中出现的 junit/hamcrest/hsqldb/commons-collections4 是该 POM 中非 compile 范围的声明,不会进入运行时 classpath(见第九章 Q3)。
4.4 编写验证程序
写两个演示类:BasicCacheDemo 验证内存缓存读写与统计,DiskCacheDemo 用于磁盘缓存(本节先创建并编译,磁盘持久化运行验证见《Apache Commons JCS 3.2.1 快速入门与集成示例》与《Apache Commons JCS 3.2.1 配置参数详解》)。
/opt/jcs-demo/src/main/java/demo/BasicCacheDemo.java 内容:
package demo;
import java.util.List;
import org.apache.commons.jcs3.JCS;
import org.apache.commons.jcs3.access.CacheAccess;
import org.apache.commons.jcs3.engine.stats.behavior.IStatElement;
import org.apache.commons.jcs3.engine.stats.behavior.IStats;
/**
* 基础缓存演示: put / get / 命中率统计 / remove / clear
*/
public class BasicCacheDemo {
public static void main(String[] args) {
CacheAccess<String, String> cache = JCS.getInstance("demoRegion");
System.out.println("[put] k1..k3");
cache.put("k1", "value-1");
cache.put("k2", "value-2");
cache.put("k3", "value-3");
System.out.println("[get] 5 次 (3 命中 2 未命中)");
for (int i = 1; i <= 5; i++) {
String k = "k" + i;
System.out.println(" get(" + k + ") = " + cache.get(k));
}
System.out.println("[remove] k1");
cache.remove("k1");
System.out.println(" get(k1) after remove = " + cache.get("k1"));
System.out.println("[statistics]");
printStats(cache.getStatistics());
System.out.println(" getStats() = " + cache.getStats());
System.out.println("[clear]");
cache.clear();
System.out.println(" get(k2) after clear = " + cache.get("k2"));
System.out.println("[statistics after clear]");
printStats(cache.getStatistics());
System.out.println(" getStats() = " + cache.getStats());
cache.dispose();
System.out.println("done");
}
private static void printStats(IStats stats) {
System.out.println(" type = " + stats.getTypeName());
List<IStatElement<?>> elems = stats.getStatElements();
for (IStatElement<?> e : elems) {
System.out.println(" " + e.getName() + " = " + e.getData());
}
}
}
/opt/jcs-demo/src/main/java/demo/DiskCacheDemo.java 内容:
package demo;
import org.apache.commons.jcs3.JCS;
import org.apache.commons.jcs3.access.CacheAccess;
/**
* 磁盘缓存演示: java demo.DiskCacheDemo [put|get]
* region: diskRegion, 配置见 conf/cache.ccf (IndexedDiskCache, DiskPath=/opt/jcs-demo/disk-cache)
*/
public class DiskCacheDemo {
public static void main(String[] args) {
String mode = args.length > 0 ? args[0] : "put";
CacheAccess<String, String> cache = JCS.getInstance("diskRegion");
if ("put".equals(mode)) {
for (int i = 1; i <= 20; i++) {
cache.put("disk-key-" + i, "disk-value-" + i);
}
System.out.println("put 完成: disk-key-1..20");
System.out.println("get(disk-key-7) = " + cache.get("disk-key-7"));
} else {
int found = 0;
for (int i = 1; i <= 20; i++) {
String v = cache.get("disk-key-" + i);
if (v != null) {
found++;
}
System.out.println("get(disk-key-" + i + ") = " + v);
}
System.out.println("命中条数: " + found + "/20");
}
cache.dispose();
JCS.shutdown();
System.out.println("done");
}
}
4.5 编译与生成运行时 classpath
编译工程:
cd /opt/jcs-demo && mvn -B compile
输出节选(实测末尾 15 行):
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ jcs-demo ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /opt/jcs-demo/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.11.0:compile (default-compile) @ jcs-demo ---
[INFO] Changes detected - recompiling the module! :source
[INFO] Compiling 2 source files with javac [debug release 17] to target/classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.034 s
[INFO] Finished at: 2026-10-14T10:24:47Z
[INFO] ------------------------------------------------------------------------
生成运行时 classpath 文件(供 java -cp 直接运行):
cd /opt/jcs-demo && mvn -B dependency:build-classpath -Dmdep.outputFile=/opt/jcs-demo/cp.txt 2>&1 | tail -3
cat cp.txt
输出:
[INFO] Total time: 0.738 s
[INFO] Finished at: 2026-10-14T10:24:52Z
[INFO] ------------------------------------------------------------------------
/root/.m2/repository/org/apache/commons/commons-jcs3-core/3.2.1/commons-jcs3-core-3.2.1.jar
验证点:cat cp.txt 只有一行——运行时 classpath 仅需 commons-jcs3-core-3.2.1.jar,再次印证无传递依赖。
4.6 运行验证与配置文件必需项
JCS 启动时从 classpath 上加载名为 cache.ccf 的配置资源。先故意不提供该文件运行,观察真实行为:
cd /opt/jcs-demo && java -cp target/classes:$(cat cp.txt) demo.BasicCacheDemo
输出:
Oct 14, 2026 10:25:01 AM org.apache.commons.jcs3.engine.control.CompositeCacheManager
INFO: Instance is null, creating with config [/cache.ccf]
Oct 14, 2026 10:25:01 AM org.apache.commons.jcs3.engine.control.CompositeCacheManager
INFO: Creating cache manager from config file: /cache.ccf
Exception in thread "main" java.lang.NullPointerException: inStream parameter is null
at java.base/java.util.Objects.requireNonNull(Objects.java:235)
at java.base/java.util.Properties.load(Properties.java:410)
at org.apache.commons.jcs3.engine.control.CompositeCacheManager.configure(CompositeCacheManager.java:328)
at org.apache.commons.jcs3.engine.control.CompositeCacheManager.getInstance(CompositeCacheManager.java:188)
at org.apache.commons.jcs3.engine.control.CompositeCacheManager.getInstance(CompositeCacheManager.java:163)
at org.apache.commons.jcs3.JCS.getCacheManager(JCS.java:126)
at org.apache.commons.jcs3.JCS.getInstance(JCS.java:144)
at demo.BasicCacheDemo.main(BasicCacheDemo.java:16)
⚠️ 注意:JCS 3.2.1 在 classpath 上找不到 cache.ccf 时直接抛 NullPointerException(
inStream parameter is null),不会回退到内置默认配置。日志中config [/cache.ccf]表示按类路径资源名cache.ccf查找。这是本版本最容易踩的坑,配置文件详解见《Apache Commons JCS 3.2.1 配置参数详解》。
创建配置文件 /opt/jcs-demo/conf/cache.ccf(本节先给出磁盘缓存版本,逐项详解见《Apache Commons JCS 3.2.1 配置参数详解》):
# JCS 配置: 仅对 diskRegion 启用索引磁盘缓存
# 内存缓存: LRU, 最多 100 条
# diskRegion: 内存上限 10 条, UPDATE 模式(写入即落盘), 辅助缓存 DC
jcs.region.diskRegion=DC
jcs.region.diskRegion.cacheattributes=org.apache.commons.jcs3.engine.CompositeCacheAttributes
jcs.region.diskRegion.cacheattributes.MaxObjects=10
jcs.region.diskRegion.cacheattributes.MemoryCacheName=org.apache.commons.jcs3.engine.memory.lru.LRUMemoryCache
jcs.region.diskRegion.cacheattributes.DiskUsagePatternName=UPDATE
# DC = IndexedDiskCache, 磁盘文件目录
jcs.auxiliary.DC=org.apache.commons.jcs3.auxiliary.disk.indexed.IndexedDiskCacheFactory
jcs.auxiliary.DC.attributes=org.apache.commons.jcs3.auxiliary.disk.indexed.IndexedDiskCacheAttributes
jcs.auxiliary.DC.attributes.DiskPath=/opt/jcs-demo/disk-cache
把 conf 目录加入 classpath 后重新运行:
cd /opt/jcs-demo && java -Dfile.encoding=UTF-8 -cp target/classes:conf:$(cat cp.txt) demo.BasicCacheDemo
输出:
Oct 14, 2026 10:27:14 AM org.apache.commons.jcs3.engine.control.CompositeCacheManager
INFO: Instance is null, creating with config [/cache.ccf]
Oct 14, 2026 10:27:14 AM org.apache.commons.jcs3.engine.control.CompositeCacheManager
INFO: Creating cache manager from config file: /cache.ccf
Oct 14, 2026 10:27:14 AM org.apache.commons.jcs3.engine.control.CompositeCacheManager
INFO: Setting default auxiliaries to "null"
Oct 14, 2026 10:27:14 AM org.apache.commons.jcs3.engine.control.CompositeCacheConfigurator
INFO: No special CompositeCacheAttributes class defined for key [jcs.default.cacheattributes], using default class.
Oct 14, 2026 10:27:14 AM org.apache.commons.jcs3.engine.control.CompositeCacheManager
INFO: setting defaultCompositeCacheAttributes to [ useLateral = true, useRemote = true, useDisk = true, maxObjs = 100, maxSpoolPerRun = -1, diskUsagePattern = SWAP, spoolChunkSize = 2 ]
Oct 14, 2026 10:27:14 AM org.apache.commons.jcs3.engine.control.CompositeCacheConfigurator
INFO: No special ElementAttribute class defined for key [jcs.default.elementattributes], using default class.
Oct 14, 2026 10:27:14 AM org.apache.commons.jcs3.engine.control.CompositeCacheManager
INFO: setting defaultElementAttributes to [ IS_LATERAL = true, IS_SPOOL = true, IS_REMOTE = true, IS_ETERNAL = true, MaxLifeSeconds = -1, IdleTime = -1, CreateTime = 1791973634659, LastAccessTime = 1791973634659, getTimeToLiveSeconds() = -1, createTime = 1791973634659 ]
Oct 14, 2026 10:27:14 AM org.apache.commons.jcs3.engine.control.CompositeCacheConfigurator
INFO: No special ElementAttribute class defined for key [jcs.region.diskRegion.elementattributes], using default class.
Oct 14, 2026 10:27:14 AM org.apache.commons.jcs3.engine.memory.AbstractDoubleLinkedListMemoryCache
INFO: initialized MemoryCache for diskRegion
Oct 14, 2026 10:27:14 AM org.apache.commons.jcs3.engine.control.CompositeCache
INFO: Constructed cache with name [diskRegion] and cache attributes [ useLateral = true, useRemote = true, useDisk = true, maxObjs = 10, maxSpoolPerRun = -1, diskUsagePattern = UPDATE, spoolChunkSize = 2 ]
Oct 14, 2026 10:27:14 AM org.apache.commons.jcs3.auxiliary.AuxiliaryCacheConfigurator
INFO: No cache event logger defined for auxiliary [jcs.auxiliary.DC]
Oct 14, 2026 10:27:14 AM org.apache.commons.jcs3.auxiliary.AuxiliaryCacheConfigurator
INFO: Using standard serializer [org.apache.commons.jcs3.utils.serialization.StandardSerializer@5025a98f] for auxiliary [jcs.auxiliary.DC]
Oct 14, 2026 10:27:14 AM org.apache.commons.jcs3.auxiliary.disk.indexed.IndexedDiskCache
INFO: Region [diskRegion] : Set maxKeySize to: "5,000"
Oct 14, 2026 10:27:14 AM org.apache.commons.jcs3.auxiliary.disk.indexed.IndexedDiskCache
INFO: Region [diskRegion] : Cache file root directory: /opt/jcs-demo/disk-cache
Oct 14, 2026 10:27:14 AM org.apache.commons.jcs3.auxiliary.disk.indexed.IndexedDiskCache
INFO: Region [diskRegion] : Indexed Disk Cache is alive.
Oct 14, 2026 10:27:14 AM org.apache.commons.jcs3.engine.control.CompositeCacheConfigurator
INFO: Parsed regions [diskRegion]
Oct 14, 2026 10:27:14 AM org.apache.commons.jcs3.engine.control.CompositeCacheManager
INFO: Finished configuration in 67 ms.
Oct 14, 2026 10:27:14 AM org.apache.commons.jcs3.engine.control.CompositeCacheConfigurator
INFO: No special ElementAttribute class defined for key [jcs.region.demoRegion.elementattributes], using default class.
Oct 14, 2026 10:27:14 AM org.apache.commons.jcs3.engine.memory.AbstractDoubleLinkedListMemoryCache
INFO: initialized MemoryCache for demoRegion
Oct 14, 2026 10:27:14 AM org.apache.commons.jcs3.engine.control.CompositeCache
INFO: Constructed cache with name [demoRegion] and cache attributes [ useLateral = true, useRemote = true, useDisk = true, maxObjs = 100, maxSpoolPerRun = -1, diskUsagePattern = SWAP, spoolChunkSize = 2 ]
[put] k1..k3
[get] 5 次 (3 命中 2 未命中)
get(k1) = value-1
get(k2) = value-2
get(k3) = value-3
get(k4) = null
get(k5) = null
[remove] k1
get(k1) after remove = null
[statistics]
type = null
HitCountRam = 3
HitCountAux = 0
getStats() = Region Name = demoRegion
HitCountRam = 3
HitCountAux = 0
---------------------------Memory Cache
Put Count = 3
Hit Count = 3
Miss Count = 3
Map Size = 2
List Size = 2
[clear]
get(k2) after clear = null
[statistics after clear]
type = null
HitCountRam = 3
HitCountAux = 0
getStats() = Region Name = demoRegion
HitCountRam = 3
HitCountAux = 0
---------------------------Memory Cache
Put Count = 3
Hit Count = 3
Miss Count = 4
Map Size = 0
List Size = 0
Oct 14, 2026 10:27:14 AM org.apache.commons.jcs3.engine.control.CompositeCache
INFO: In DISPOSE, [demoRegion] fromRemote [false]
Oct 14, 2026 10:27:14 AM org.apache.commons.jcs3.engine.control.event.ElementEventQueue
INFO: Element event queue destroyed: org.apache.commons.jcs3.engine.control.event.ElementEventQueue@5bcea91b
Oct 14, 2026 10:27:14 AM org.apache.commons.jcs3.engine.control.CompositeCache
INFO: In DISPOSE, [demoRegion] disposing of memory cache.
Oct 14, 2026 10:27:14 AM org.apache.commons.jcs3.engine.memory.AbstractMemoryCache
INFO: Memory Cache dispose called.
done
验证点(逐项核对统计与程序设计完全吻合):
get(k1..k3)命中返回value-1..3,get(k4/k5)未命中返回null;- 统计
Put Count = 3、Hit Count = 3、Miss Count = 3(k4/k5/remove 后的 k1)、Map Size = 2(remove 掉 k1 后剩 k2/k3); clear后get(k2)为null,Miss Count再加 1 变为 4,Map Size = 0;- 配置加载日志显示
Parsed regions [diskRegion]、maxObjs = 10、diskUsagePattern = UPDATE,与 cache.ccf 一致;demoRegion未在配置中定义,走默认属性maxObjs = 100。
-Dfile.encoding=UTF-8 的作用:本环境默认编码为 ANSI_X3.4-1968(见 4.2 回显),程序输出含中文时必须显式指定 UTF-8,否则乱码。
五、离线安装方案(B:官方二进制包)
适合内网隔离、无法访问 Maven 中央仓库的环境。使用官方 commons-jcs3-dist-3.2.1-bin.tar.gz 发行包,解压后直接以 jar 编译运行。
5.1 方案说明与适用场景
官方二进制包内含全部模块 jar(core 及各 JCache 模块,含 sources/javadoc/tests 变体)。本方案流程:下载 → 解压 → 用 core jar 编译一个最小程序 → 运行验证。core 模块无传递依赖,无需补任何第三方 jar。
5.2 下载官方二进制包
先确认系统有无 wget,实测本环境未预装:
wget --version
输出:
bash: line 1: wget: command not found
改用 curl 下载官方二进制包:
cd /tmp && curl -fsSLO https://downloads.apache.org/commons/jcs/binaries/commons-jcs3-dist-3.2.1-bin.tar.gz
ls -la /tmp/commons-jcs3-dist-3.2.1-bin.tar.gz
输出:
-rw-r--r-- 1 root root 7837164 Oct 14 10:28 /tmp/commons-jcs3-dist-3.2.1-bin.tar.gz
⚠️ 注意:源码包与二进制包不在同一目录——二进制包在
binaries/子目录,源码包在source/子目录(第六章实测binaries/下的 src 包为 404)。
5.3 解压与目录结构
解压到 /opt/jcs3-dist 并查看结构:
mkdir -p /opt/jcs3-dist && tar xzf commons-jcs3-dist-3.2.1-bin.tar.gz -C /opt/jcs3-dist
ls -la /opt/jcs3-dist/
输出:
total 12
drwxr-xr-x 3 root root 4096 Oct 14 10:28 .
drwxr-xr-x 1 root root 4096 Oct 14 10:28 ..
drwxr-xr-x 7 root root 4096 Oct 14 10:28 commons-jcs3-3.2.1-bin
列出发行包内全部 jar:
find /opt/jcs3-dist -name "*.jar" | sort
输出:
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-core/commons-jcs3-core-3.2.1-javadoc.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-core/commons-jcs3-core-3.2.1-sources.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-core/commons-jcs3-core-3.2.1-test-sources.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-core/commons-jcs3-core-3.2.1-tests.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-core/commons-jcs3-core-3.2.1.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-jcache-extras/commons-jcs3-core-3.2.1.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-jcache-extras/commons-jcs3-jcache-extras-3.2.1-javadoc.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-jcache-extras/commons-jcs3-jcache-extras-3.2.1-sources.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-jcache-extras/commons-jcs3-jcache-extras-3.2.1-test-sources.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-jcache-extras/commons-jcs3-jcache-extras-3.2.1-tests.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-jcache-extras/commons-jcs3-jcache-extras-3.2.1.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-jcache-openjpa/commons-jcs3-core-3.2.1.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-jcache-openjpa/commons-jcs3-jcache-openjpa-3.2.1-javadoc.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-jcache-openjpa/commons-jcs3-jcache-openjpa-3.2.1-sources.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-jcache-openjpa/commons-jcs3-jcache-openjpa-3.2.1-test-sources.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-jcache-openjpa/commons-jcs3-jcache-openjpa-3.2.1-tests.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-jcache-openjpa/commons-jcs3-jcache-openjpa-3.2.1.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-jcache/commons-jcs3-core-3.2.1.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-jcache/commons-jcs3-jcache-3.2.1-cdi.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-jcache/commons-jcs3-jcache-3.2.1-javadoc.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-jcache/commons-jcs3-jcache-3.2.1-nocdi.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-jcache/commons-jcs3-jcache-3.2.1-sources.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-jcache/commons-jcs3-jcache-3.2.1-test-sources.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-jcache/commons-jcs3-jcache-3.2.1-tests.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-jcache/commons-jcs3-jcache-3.2.1.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-tck-tests/commons-jcs3-core-3.2.1.jar
/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-tck-tests/commons-jcs3-jcache-tck-3.2.1.jar
查看发行包顶层结构:
ls /opt/jcs3-dist/commons-jcs3-3.2.1-bin/
输出:
LICENSE
NOTICE
RELEASE-NOTES.txt
commons-jcs-core
commons-jcs-jcache
commons-jcs-jcache-extras
commons-jcs-jcache-openjpa
commons-jcs-tck-tests
解读:核心 jar 是 /opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-core/commons-jcs3-core-3.2.1.jar(547 kB,见 4.3 下载回显);其余为 JCache 相关模块。各 JCache 模块目录下也附带了一份 core jar。
5.4 最小程序编译运行验证
创建演示目录与最小程序 /opt/jcs-dist-demo/Main.java:
import org.apache.commons.jcs3.JCS;
import org.apache.commons.jcs3.access.CacheAccess;
public class Main {
public static void main(String[] args) {
CacheAccess<String, String> cache = JCS.getInstance("binRegion");
cache.put("hello", "world");
System.out.println("get(hello) = " + cache.get("hello"));
cache.dispose();
System.out.println("OK");
}
}
配套最小配置 /opt/jcs-dist-demo/cache.ccf(只定义默认区域属性;classpath 上无 cache.ccf 会 NPE,见 4.6 实测):
jcs.default.cacheattributes=org.apache.commons.jcs3.engine.CompositeCacheAttributes
jcs.default.cacheattributes.MaxObjects=100
jcs.default.cacheattributes.MemoryCacheName=org.apache.commons.jcs3.engine.memory.lru.LRUMemoryCache
逐项说明:jcs.default.cacheattributes 定义所有未显式声明区域(如本例的 binRegion)的公共属性;MaxObjects=100 内存最多缓存 100 个对象;MemoryCacheName 指定内存淘汰实现为 LRU。
编译(仅依赖 core jar 一个文件):
cd /opt/jcs-dist-demo && javac -cp /opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-core/commons-jcs3-core-3.2.1.jar Main.java
echo "javac exit=$?"
ls
输出:
javac exit=0
Main.class
Main.java
cache.ccf
运行(classpath 为当前目录 + core jar;core 无传递依赖,无需其它 jar):
cd /opt/jcs-dist-demo && java -cp .:/opt/jcs3-dist/commons-jcs3-3.2.1-bin/commons-jcs-core/commons-jcs3-core-3.2.1.jar Main
输出节选(实测首尾;中段为 JUL 配置 INFO 日志,含 defaultCompositeCacheAttributes = [ useLateral = true, useRemote = true, useDisk = true, maxObjs = 100, maxSpoolPerRun = -1, diskUsagePattern = SWAP, spoolChunkSize = 2 ]、Parsed regions []、Finished configuration in 16 ms、initialized MemoryCache for binRegion 等,已省略):
Oct 14, 2026 10:29:14 AM org.apache.commons.jcs3.engine.control.CompositeCacheManager
INFO: Instance is null, creating with config [/cache.ccf]
Oct 14, 2026 10:29:14 AM org.apache.commons.jcs3.engine.control.CompositeCacheManager
INFO: Creating cache manager from config file: /cache.ccf
(中段 JUL 配置 INFO 日志省略)
get(hello) = world
Oct 14, 2026 10:29:14 AM org.apache.commons.jcs3.engine.control.CompositeCache
INFO: In DISPOSE, [binRegion] fromRemote [false]
Oct 14, 2026 10:29:14 AM org.apache.commons.jcs3.engine.control.event.ElementEventQueue
INFO: Element event queue destroyed: org.apache.commons.jcs3.engine.control.event.ElementEventQueue@31a5c39e
Oct 14, 2026 10:29:14 AM org.apache.commons.jcs3.engine.control.CompositeCache
INFO: In DISPOSE, [binRegion] disposing of memory cache.
Oct 14, 2026 10:29:14 AM org.apache.commons.jcs3.engine.memory.AbstractMemoryCache
INFO: Memory Cache dispose called.
OK
验证点:get(hello) = world 且以 OK 结束,说明不依赖 Maven、纯 jar 直跑同样可用。命令行 java 通过当前目录(-cp .)找到 cache.ccf。
六、源码安装方案(C:官方源码编译)
适合需要定制源码、调试或跟随版本线的场景。使用官方源码包,由 Maven 构建全部模块。
6.1 方案说明与前置依赖
下载官方源码包并用 Maven 构建整个 reactor。构建需要 JDK 17 与 Maven(与方案 A 相同环境),首次构建需联网下载构建插件与依赖。
6.2 定位并下载源码包
注意:源码包不在 binaries/ 目录。先实测确认直接拼 binaries 路径会 404:
curl -sI https://downloads.apache.org/commons/jcs/binaries/commons-jcs3-dist-3.2.1-src.tar.gz | head -8
输出:
HTTP/1.1 404 Not Found
Date: Wed, 14 Oct 2026 10:34:08 GMT
Server: Apache
Content-Type: text/html; charset=iso-8859-1
按目录页探测 source/ 子目录,确认源码包存在:
curl -s https://downloads.apache.org/commons/jcs/source/ | grep -oE "href=\"[^\"]+\"" | head -10
输出:
href="http://archive.apache.org/dist/commons/"
href="#mirrors"
href="#sig"
href="?C=N;O=D"
href="?C=M;O=A"
href="?C=S;O=A"
href="?C=D;O=A"
href="/commons/jcs/"
href="commons-jcs3-dist-3.2.1-src.tar.gz"
href="commons-jcs3-dist-3.2.1-src.tar.gz.asc"
从 source/ 目录下载源码包并解压:
cd /tmp && curl -fSL -o commons-jcs3-dist-3.2.1-src.tar.gz https://downloads.apache.org/commons/jcs/source/commons-jcs3-dist-3.2.1-src.tar.gz
ls -la commons-jcs3-dist-3.2.1-src.tar.gz
mkdir -p /opt/jcs3-src && tar xzf commons-jcs3-dist-3.2.1-src.tar.gz -C /opt/jcs3-src
ls /opt/jcs3-src/ && ls /opt/jcs3-src/*/ | head -20
输出:
100 805k 100 805k 0 0 568k 0 0:00:01 0:00:01 --:--:-- 568k
-rw-r--r-- 1 root root 824939 Oct 14 10:34 commons-jcs3-dist-3.2.1-src.tar.gz
commons-jcs3-3.2.1-src
BUILDING.txt
CODE_OF_CONDUCT.md
CONTRIBUTING.md
LICENSE
NOTICE
README.md
RELEASE-NOTES.txt
SECURITY.md
commons-jcs-core
commons-jcs-dist
commons-jcs-jcache
commons-jcs-jcache-extras
commons-jcs-jcache-openjpa
commons-jcs-tck-tests
pom.xml
src
xdocs
解读:第一行是 curl 的下载进度;源码包实测 824,939 字节;解压后 commons-jcs3-3.2.1-src 目录含 5 个子模块源码与聚合 pom.xml。
6.3 编译构建
在源码根目录执行 Maven 构建(跳过测试):
cd /opt/jcs3-src/commons-jcs3-3.2.1-src && mvn -B package -DskipTests
输出节选(实测 Reactor Summary 完整;构建期间从中央仓库下载 973 个依赖/插件工件,联网下载约占 13:08 min):
[INFO] Reactor Summary for Apache Commons JCS 3.2.1:
[INFO]
[INFO] Apache Commons JCS ................................. SUCCESS [13:08 min]
[INFO] Apache Commons JCS :: Core ......................... SUCCESS [ 31.599 s]
[INFO] Apache Commons JCS :: JCache ....................... SUCCESS [ 1.054 s]
[INFO] Apache Commons JCS :: JCache TCK ................... SUCCESS [ 0.719 s]
[INFO] Apache Commons JCS :: JCache Extras ................ SUCCESS [ 1.064 s]
[INFO] Apache Commons JCS :: JCache OpenJPA ............... SUCCESS [ 1.048 s]
[INFO] Apache Commons JCS :: Distribution ................. SUCCESS [ 0.143 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 13:43 min
[INFO] Finished at: 2026-10-14T10:48:18Z
[INFO] ------------------------------------------------------------------------
exit=0
验证产物 jar 是否生成:
find /opt/jcs3-src/commons-jcs3-3.2.1-src -name "*.jar" | sort
输出:
/opt/jcs3-src/commons-jcs3-3.2.1-src/commons-jcs-core/target/commons-jcs3-core-3.2.1-sources.jar
/opt/jcs3-src/commons-jcs3-3.2.1-src/commons-jcs-core/target/commons-jcs3-core-3.2.1-test-sources.jar
/opt/jcs3-src/commons-jcs3-3.2.1-src/commons-jcs-core/target/commons-jcs3-core-3.2.1-tests.jar
/opt/jcs3-src/commons-jcs3-3.2.1-src/commons-jcs-core/target/commons-jcs3-core-3.2.1.jar
/opt/jcs3-src/commons-jcs3-3.2.1-src/commons-jcs-jcache-extras/target/commons-jcs3-jcache-extras-3.2.1-sources.jar
/opt/jcs3-src/commons-jcs3-3.2.1-src/commons-jcs-jcache-extras/target/commons-jcs3-jcache-extras-3.2.1-test-sources.jar
/opt/jcs3-src/commons-jcs3-3.2.1-src/commons-jcs-jcache-extras/target/commons-jcs3-jcache-extras-3.2.1-tests.jar
/opt/jcs3-src/commons-jcs3-3.2.1-src/commons-jcs-jcache-extras/target/commons-jcs3-jcache-extras-3.2.1.jar
/opt/jcs3-src/commons-jcs3-3.2.1-src/commons-jcs-jcache-openjpa/target/commons-jcs3-jcache-openjpa-3.2.1-sources.jar
/opt/jcs3-src/commons-jcs3-3.2.1-src/commons-jcs-jcache-openjpa/target/commons-jcs3-jcache-openjpa-3.2.1-test-sources.jar
/opt/jcs3-src/commons-jcs3-3.2.1-src/commons-jcs-jcache-openjpa/target/commons-jcs3-jcache-openjpa-3.2.1-tests.jar
/opt/jcs3-src/commons-jcs3-3.2.1-src/commons-jcs-jcache-openjpa/target/commons-jcs3-jcache-openjpa-3.2.1.jar
/opt/jcs3-src/commons-jcs3-3.2.1-src/commons-jcs-jcache/target/commons-jcs3-jcache-3.2.1-cdi.jar
/opt/jcs3-src/commons-jcs3-3.2.1-src/commons-jcs-jcache/target/commons-jcs3-jcache-3.2.1-nocdi.jar
/opt/jcs3-src/commons-jcs3-3.2.1-src/commons-jcs-jcache/target/commons-jcs3-jcache-3.2.1-sources.jar
/opt/jcs3-src/commons-jcs3-3.2.1-src/commons-jcs-jcache/target/commons-jcs3-jcache-3.2.1-tests.jar
/opt/jcs3-src/commons-jcs3-3.2.1-src/commons-jcs-jcache/target/commons-jcs3-jcache-3.2.1-test-sources.jar
/opt/jcs3-src/commons-jcs3-3.2.1-src/commons-jcs-jcache/target/commons-jcs3-jcache-3.2.1.jar
/opt/jcs3-src/commons-jcs3-3.2.1-src/commons-jcs-tck-tests/target/commons-jcs3-jcache-tck-3.2.1.jar
验证点:BUILD SUCCESS,核心产物为 commons-jcs-core/target/commons-jcs3-core-3.2.1.jar,另有 jcache 系列与 dist 聚合包。纯构建 Core 模块仅 31.6 s,总耗时长主要是首次联网下载。
七、多方案对照与选择建议
三种方案各有取舍,本节汇总关键差异并给出选型建议。
| 维度 | 方案 A:Maven 依赖 | 方案 B:官方二进制包 | 方案 C:源码编译 |
|---|---|---|---|
| 是否需联网 | 构建时需联网(首次实测约 3 分钟) | 仅下载阶段需联网 | 构建时需联网(实测总耗时 13:43 min) |
| 依赖完整性 | 自动解析(core 无传递依赖) | 只需 core jar 一个文件 | 构建全部模块 jar |
| 产物位置 | 本地 Maven 仓库 ~/.m2 | /opt/jcs3-dist | /opt/jcs3-src/*/target |
| 版本升级 | 改 pom 版本号重新解析 | 重新下载替换目录 | 重新下载源码包构建 |
| 适用场景 | 可联网开发/CI(推荐) | 内网隔离、离线部署 | 定制源码、调试、跟版本线 |
选择建议:可联网优先方案 A(声明依赖即可,最轻);内网隔离选方案 B(一次下载、单 jar 拷贝即可离线运行);需要改源码或自验证补丁选方案 C。三方案的核心 jar 均为 commons-jcs3-core-3.2.1,行为一致(4.6 与 5.4 的运行验证分别对应 A/B 两种 classpath 形态)。
八、配置说明
Commons JCS 的运行期「配置」集中在配置文件与 JVM 启动参数两方面,本节逐项说明。
- 配置文件位置与查找机制:JCS 从 classpath 上加载名为
cache.ccf的资源(日志显示为/cache.ccf)。两种常用放法:① Maven 工程src/main/resources/cache.ccf(编译后进target/classes);② 独立conf目录并把该目录加入-cp(本文 4.6 采用,-cp target/classes:conf:$(cat cp.txt))。classpath 无 cache.ccf 时 3.2.1 直接 NPE(4.6 实测),不是警告。 - 最小可用配置:只需
jcs.default.cacheattributes三行(见 5.4 的cache.ccf),未显式定义的区域走默认属性(日志回显maxObjs = 100、diskUsagePattern = SWAP)。 - 磁盘缓存目录:
jcs.auxiliary.DC.attributes.DiskPath指定磁盘缓存文件目录(本文/opt/jcs-demo/disk-cache),启动日志会回显Cache file root directory: /opt/jcs-demo/disk-cache。目录由 JCS 自动创建,需对该路径有写权限。 - JVM 编码参数:默认编码为 POSIX/ASCII 的系统上运行含中文输出的程序需加
-Dfile.encoding=UTF-8(4.6 实测命令均带此参数)。 - JVM 堆内存:本文示例未限制堆;JCS 为进程内库,生产集成时建议在应用启动参数中固定
-Xms256m -Xmx512m区间,并按缓存条目大小评估。 - 依赖管理:
commons-jcs3-core:3.2.1无 compile 传递依赖(4.3/4.5 实测),离线分发只需 core jar;JCache、OpenJPA 等扩展模块按需另行引入。
九、常见问题(FAQ)
Q1:运行直接抛 NullPointerException: inStream parameter is null?
classpath 上没有 cache.ccf。JCS 3.2.1 找不到该配置资源时不会回退内置默认值,而是 NPE(完整栈见 4.6 实测)。解决:把 cache.ccf 放进 src/main/resources 或独立目录并加入 -cp,日志出现 Creating cache manager from config file: /cache.ccf 且不再抛异常即为修复。
Q2:程序输出的中文乱码?
系统默认编码为 ANSI_X3.4-1968(POSIX locale)所致。运行时加 -Dfile.encoding=UTF-8(4.6 命令即如此),Maven 工程源码层面配 project.build.sourceEncoding=UTF-8。
Q3:dependency:get 下载了 junit、hsqldb 等组件,运行时需要它们吗?
不需要。commons-jcs3-core 的 POM 里 junit/hamcrest/hsqldb/commons-collections4 均为非 compile 范围声明(4.3 回显可见其下载过程),实测 dependency:tree 与 dependency:build-classpath(4.3/4.5)证明运行时 classpath 只需 core jar 本身。
Q4:服务器没装 wget 怎么下载?
用 curl 即可:curl -fsSLO <URL>(5.2 实测命令)。二者对 downloads.apache.org 等价。
Q5:日志里一直显示 Creating cache manager from config file: /cache.ccf,但我的文件在 /opt/jcs-demo/conf/cache.ccf,路径对吗?
对。/cache.ccf 是类路径资源名(以根 / 开头表示从 classpath 根查找),不是文件系统绝对路径。JCS 依次从 classpath 各条目中找名为 cache.ccf 的资源,5.4 中 -cp . 能生效正是因为 cache.ccf 就在当前目录。
Q6:进程结束时日志出现 Shutdown hook activated. Shutdown was not called. Shutting down JCS.?
这是 JCS 自带的 Shutdown 钩子在起作用:主线程未显式调用 JCS.shutdown() 时,JVM 退出阶段会自动关闭缓存管理器(该日志在 CentOS 8 实测中捕获,详见《CentOS 8 安装 Apache Commons JCS 指南》4.6 节回显)。建议程序仍显式 dispose() + JCS.shutdown(),磁盘缓存 keys 落盘依赖它(实测结论见《Apache Commons JCS 3.2.1 快速入门与集成示例》第六章)。
十、卸载与清理
Commons JCS 为纯 Java 库,不做系统级安装,删除工程目录、发行包与本地仓库中的构件即可完全清理:
rm -rf /opt/jcs-demo /opt/jcs-dist-demo /opt/jcs3-dist /opt/jcs3-src /tmp/commons-jcs3-dist-3.2.1-bin.tar.gz /tmp/commons-jcs3-dist-3.2.1-src.tar.gz
ls -d /opt/jcs-demo /opt/jcs-dist-demo /opt/jcs3-dist /opt/jcs3-src 2>/dev/null || echo "all removed"
输出:
all removed
如需同时清理 Maven 本地仓库中的 JCS 构件:
rm -rf /root/.m2/repository/org/apache/commons/commons-jcs3-core /root/.m2/repository/org/apache/commons/commons-jcs3-jcache /root/.m2/repository/org/apache/commons/commons-jcs3-jcache-extras /root/.m2/repository/org/apache/commons/commons-jcs3-jcache-openjpa
ls /root/.m2/repository/org/apache/commons/commons-jcs3-core 2>/dev/null || echo "maven artifacts removed"
输出:
maven artifacts removed
⚠️ 注意:JDK 与 Maven 属基础环境,本文不随 JCS 卸载;如需一并移除用
apt-get remove -y openjdk-17-jdk maven并自行确认影响范围。
十一、参考链接
- Apache Commons JCS 官方站点:https://commons.apache.org/proper/commons-jcs/
- 官方发行下载目录(binaries 与 source 子目录):https://downloads.apache.org/commons/jcs/
- 历史版本归档目录:https://archive.apache.org/dist/commons/
- Maven 中央仓库坐标页:https://repo1.maven.org/maven2/org/apache/commons/commons-jcs3-core/
- Apache Commons JCS 源码仓库(GitHub 镜像):https://github.com/apache/commons-jcs