Apache Commons FileUpload 常用 CLI 命令与工具详解
以命令行实操演示 Apache Commons FileUpload 2.0.0-M5:jar 查看解包、javac/java 编译运行、mvn 构建、curl -F 上传 multipart、sha512sum 校验,命令均附实测回显。
Apache Commons FileUpload 常用 CLI 命令与工具详解
目标:梳理 Apache Commons FileUpload 2.0.0-M5 配套的全部命令行工具与高频命令(jar、javac、java、mvn、curl -F、sha512sum 等),每条命令给出实测回显,已在 Ubuntu 22.04.5 服务器实测通过。
一、环境信息
本节列出文档实测的服务器基础信息。
- 操作系统:Ubuntu 22.04.5 LTS(x86_64)
- JDK:OpenJDK 17.0.20.1(含 jar/javac/java 工具链)
- 构建工具:Apache Maven 3.6.3
- 组件版本:Apache Commons FileUpload 2.0.0-M5
- 依赖:commons-io 2.21.0、jakarta.servlet-api 5.0.0、Jetty 11.0.26(验证用)
- 实验目录:
/opt/fu-lab
二、工具概览
本节说明 FileUpload 作为 Java 库对应的命令行工具集及其分工。
FileUpload 本身没有可执行 CLI(它是 jar 库),真正面向命令行的工具是 Java 生态工具链,按使用阶段分为五类:
| 工具 | 阶段 | 作用 |
|---|---|---|
| curl | 下载与验证 | 下载 bin 包、发起 multipart 上传测试 |
| sha512sum | 完整性 | 校验下载包哈希 |
| jar | 构件检查 | 查看/解包 jar 内容与清单 |
| javac/java | 编译运行 | 编译运行最小验证程序 |
| mvn | 构建 | 坐标拉依赖、打包、生成 classpath |
💡 技术拓展:Java 依赖库的"命令行工具集"不止 Maven 系——
工具链 特点 适用场景 javac + java 零依赖、最底层 无构建工具的最小验证 Maven(mvn) 坐标管理 + 生命周期 主流 Java 工程 Gradle 构建脚本即代码 多模块/复杂构建 sdkman / jenv JDK 版本管理 开发机多版本切换 本文全部命令基于 javac + Maven 组合实测,覆盖从下载到验证的完整链路。
三、前置条件
本节说明执行后续命令所需的环境(完整安装步骤见《Ubuntu 22.04 安装 Apache Commons FileUpload 指南》篇)。
- 已安装 JDK 17 与 Maven:
java -version/mvn -version可用 - 已下载 FileUpload 2.0.0-M5 bin 包至
/opt/fu-lab并解压
确认环境:
java -version 2>&1 | head -1
mvn -version 2>&1 | head -1
ls /opt/fu-lab/commons-fileupload2-2.0.0-M5/
实测回显:
openjdk version "17.0.20.1" 2026-08-18
Apache Maven 3.6.3
LICENSE.txt NOTICE.txt RELEASE-NOTES.txt
commons-fileupload2-core-2.0.0-M5.jar
commons-fileupload2-jakarta-servlet5-2.0.0-M5.jar
commons-fileupload2-jakarta-servlet6-2.0.0-M5.jar
commons-fileupload2-javax-2.0.0-M5.jar
commons-fileupload2-portlet-2.0.0-M5.jar
四、curl 命令(下载与上传实测)
本节详解 curl 在 FileUpload 生命周期中的两类用途:下载构件与 multipart 上传测试。
4.1 下载 bin 包与校验文件
cd /opt/fu-lab
curl -LO https://downloads.apache.org/commons/fileupload/binaries/commons-fileupload2-2.0.0-M5-bin.tar.gz
curl -LO https://downloads.apache.org/commons/fileupload/binaries/commons-fileupload2-2.0.0-M5-bin.tar.gz.sha512
参数说明:-L 跟随重定向(downloads.apache.org 会 302 重定向到就近下载节点),-O 以 URL 末尾文件名保存。实测文件落盘:
ls -la commons-fileupload2-2.0.0-M5-bin.tar.gz*
实测回显:
-rw-r--r-- 1 root root 1309645 Oct 13 17:59 commons-fileupload2-2.0.0-M5-bin.tar.gz
-rw-r--r-- 1 root root 129 Oct 13 17:59 commons-fileupload2-2.0.0-M5-bin.tar.gz.sha512
4.2 列出官方发布目录
curl -s https://downloads.apache.org/commons/fileupload/binaries/ | grep -oE 'href="[^"]+\.tar\.gz"' | sort -u
实测回显(输出节选):
href="commons-fileupload-1.6.0-bin.tar.gz"
href="commons-fileupload2-2.0.0-M5-bin.tar.gz"
4.3 multipart 上传实测(curl -F)
-F 以 multipart/form-data 编码发送表单;-F "name=value" 为普通字段,-F "name=@文件;type=MIME" 为文件字段:
printf "hello from curl -F upload test\nline2: multipart parsing ok\n" > /opt/fu-lab/REPORT.txt
curl -s http://127.0.0.1:18080/upload -F "author=Apache Commons FileUpload 2.0.0-M5" -F "report=@/opt/fu-lab/REPORT.txt;type=text/plain"
实测回显(服务端为 5.2 节 Servlet 回显):
Parsed FileItem count: 2
fieldName=author | isFormField=true | fileName=null | contentType=null | size=34 | value=Apache Commons FileUpload 2.0.0-M5
fieldName=report | isFormField=false | fileName=REPORT.txt | contentType=text/plain | size=65 | value=hello from curl -F upload test
line2: multipart parsing ok
size=65 与文件实际字节数一致,fileName=REPORT.txt 为 -F 上传的文件名回显,multipart 编码正确。
五、sha512sum 命令(完整性校验)
本节说明如何用官方 sha512 校验下载包。
sha512sum commons-fileupload2-2.0.0-M5-bin.tar.gz
cat commons-fileupload2-2.0.0-M5-bin.tar.gz.sha512
实测回显:
7e050be0187813dfa6fac3e9679a9be71a7956a97ff3e8e762ad2fd5552f3883ecfbe92c013c2f66409a998600c7167d8749eecbdf61ba50f69472af8a9ec533 commons-fileupload2-2.0.0-M5-bin.tar.gz
7e050be0187813dfa6fac3e9679a9be71a7956a97ff3e8e762ad2fd5552f3883ecfbe92c013c2f66409a998600c7167d8749eecbdf61ba50f69472af8a9ec533
两行哈希一致即校验通过;若不一致说明下载损坏或包被篡改。
六、jar 命令(构件查看与解包)
本节详解 jar 工具查看 FileUpload 构件的三类命令。
6.1 查看 jar 版本与类结构(jar tf)
cd /opt/fu-lab
jar tf commons-fileupload2-2.0.0-M5/commons-fileupload2-core-2.0.0-M5.jar | head -8
实测回显:
META-INF/
META-INF/MANIFEST.MF
org/
org/apache/
org/apache/commons/
org/apache/commons/fileupload2/
org/apache/commons/fileupload2/core/
META-INF/maven/
jar tf 列出的 org/apache/commons/fileupload2/core/ 即 2.x 核心包路径(1.x 为 org/apache/commons/fileupload/,无 2)。
6.2 查看工具版本(jar --version)
jar --version
实测回显:
jar 17.0.20.1
6.3 解包查看 MANIFEST 元数据(jar xf)
MANIFEST 中含构件版本、OSGi 导出包、所需 Java 版本等关键元数据:
mkdir -p /tmp/mf && cd /tmp/mf
jar xf /opt/fu-lab/commons-fileupload2-2.0.0-M5/commons-fileupload2-core-2.0.0-M5.jar META-INF/MANIFEST.MF
grep -E "Implementation-Version|Java-Version|Specification-Version" META-INF/MANIFEST.MF
实测回显:
Java-Version: 11
Implementation-Version: 2.0.0-M5
Specification-Version: 2.0.0-M5
解读:Java-Version: 11 说明该构件最低要求 Java 11(与发布说明一致);Implementation-Version/Specification-Version 均为 2.0.0-M5,版本自洽。
七、javac / java 命令(编译与运行)
本节详解编译运行 FileUpload 验证程序的命令形态。
7.1 编译(javac -cp -d -encoding)
mkdir -p /opt/fu-lab/out
javac -encoding UTF-8 -cp "/opt/fu-lab/commons-fileupload2-2.0.0-M5/commons-fileupload2-core-2.0.0-M5.jar:/opt/fu-lab/deps/commons-io-2.21.0.jar" -d /opt/fu-lab/out /opt/fu-lab/src/FileUpload2CoreDemo.java
参数说明:-encoding UTF-8 指定源码编码(服务器 locale 为 POSIX 时必加,否则中文注释报 unmappable);-cp 以冒号分隔列出 core jar 与 commons-io;-d 指定类输出目录。编译无输出即成功(退出码 0):
echo $?
实测回显:
0
7.2 运行(java -Xms/-Xmx 限制堆内存)
JVM 堆内存按规范限制在 256–512MB 区间,避免默认大堆占用:
java -Xms256m -Xmx256m -cp "/opt/fu-lab/out:/opt/fu-lab/commons-fileupload2-2.0.0-M5/commons-fileupload2-core-2.0.0-M5.jar:/opt/fu-lab/deps/commons-io-2.21.0.jar" FileUpload2CoreDemo
实测回显:
Parsed FileItem count: 2
fieldName=author | isFormField=true | fileName=null | contentType=null | value=Apache Commons FileUpload 2.0.0-M5
fieldName=report | isFormField=false | fileName=demo.txt | contentType=text/plain | value=hello from commons-fileupload2-core
-Xms256m -Xmx256m 将初始与最大堆均限为 256MB,multipart 解析正常完成。
八、mvn 命令(构建与依赖管理)
本节详解 Maven 在 FileUpload 工程中的四个常用目标。
8.1 构建打包(mvn package)
cd /opt/fu-lab/jetty-demo && mvn -q -DskipTests package
echo $?
实测回显:
0
-q 静默模式只输出错误;-DskipTests 跳过测试(FileUpload 集成验证通过 Servlet 运行时实测完成)。退出码 0 打包成功,产物在 target/。
8.2 生成依赖 classpath(mvn dependency:build-classpath)
启动 Jetty 时需要一个不含旧包干扰的完整 classpath:
cd /opt/fu-lab/jetty-demo && mvn -q dependency:build-classpath -Dmdep.outputFile=cp.txt
grep -oE "commons-fileupload2[^:]*|commons-io[^:]*" cp.txt | sort -u
实测回显:
/root/.m2/repository/commons-io/commons-io/2.21.0/commons-io-2.21.0.jar
/root/.m2/repository/org/apache/commons/commons-fileupload2-core/2.0.0-M5/commons-fileupload2-core-2.0.0-M5.jar
/root/.m2/repository/org/apache/commons/commons-fileupload2-jakarta-servlet5/2.0.0-M5/commons-fileupload2-jakarta-servlet5-2.0.0-M5.jar
输出确认传递依赖链:jakarta-servlet5 → core → commons-io 2.21.0,无旧版污染。
8.3 查看依赖树(mvn dependency:tree)
cd /opt/fu-lab/jetty-demo && mvn dependency:tree 2>&1 | grep -E "fileupload|commons-io|jetty-server|jakarta.servlet"
实测回显(输出节选):
org.apache.commons:commons-fileupload2-jakarta-servlet5:jar:2.0.0-M5:compile
\- org.apache.commons:commons-fileupload2-core:jar:2.0.0-M5:compile
\- commons-io:commons-io:jar:2.21.0:compile
org.eclipse.jetty:jetty-server:jar:11.0.26:compile
jakarta.servlet:jakarta.servlet-api:jar:5.0.0:provided
解读:compile scope 的 fileupload2-core 自动带入 commons-io;jakarta.servlet-api 为 provided(Web 服务器运行期自带);jetty 仅验证用。
8.4 查看插件目标(mvn help:describe)
cd /opt/fu-lab/jetty-demo && mvn help:describe -Dplugin=org.codehaus.mojo:exec-maven-plugin -Dgoal=java 2>&1 | tail -12
实测回显(输出节选):
Mojo: 'exec:java'
exec:java
Description: Executes the supplied java class in the current VM with the
enclosing project's dependencies as classpath.
For more information, run 'mvn help:describe' with the detail flag
[INFO] BUILD SUCCESS
[INFO] Total time: 0.743 s
解读:该目标(goal)为 exec:java,作用是"在当前 JVM 中执行给定的 Java 类,并把工程依赖作为 classpath";-DmainClass 参数用于指定主类(本工程通过 exec-maven-plugin 配置的 mainClass 指向 upload.UploadServer)。
九、注意事项
本节汇总使用上述命令时的要点。
- classpath 顺序:
-cp中先列工程类目录再列 jar;切勿把整个/root/.m2/repository用 find 拼进 classpath——会混入旧版 commons-io(如 1.4)导致NoSuchMethodError: FileUtils.getTempDirectoryPath(),应用mvn dependency:build-classpath生成的清单(见 8.2 实测)。 - 编码一致性:javac 加
-encoding UTF-8,curl -F 文件名与表单值保持 UTF-8,Servlet 侧getString(StandardCharsets.UTF_8),任一处不一致即乱码。 - JVM 堆限制:启动验证程序统一
-Xms256m -Xmx256m(256–512MB 区间),不上默认大堆。 - 端口占用:Jetty 演示监听 18080,重复启动前确认无残留进程(
ss -ltnp | grep 18080)。 - 临时文件清理:超过阈值的上传会在
/tmp生成upload_*.tmp,验证后按需清理,避免磁盘膨胀。
十、常见问题
Q1:jar tf 列出的包路径与 1.x 不同?
定位:2.x 核心包为 org/apache/commons/fileupload2/core/,1.x 为 org/apache/commons/fileupload/。
解决:2.x 工程 import 一律用 org.apache.commons.fileupload2.*。
Q2:mvn dependency:build-classpath 与手工 find 的 classpath 有何区别?
定位:Maven 生成的是解析后的最小依赖集(含版本仲裁),find 会把本地仓库全部 jar 混入。
解决:一律用 Maven 生成;这是 4.x/6.x 篇实测遇到 NoSuchMethodError 后的标准解法。
Q3:curl -F 上传中文文件名乱码?
定位:multipart 头编码默认非 UTF-8,且未在服务端设置 headerCharset。
解决:upload.setHeaderCharset(StandardCharsets.UTF_8)(见《配置参数详解》6.5 节)。
Q4:java -Xmx256m 跑大文件上传内存不够?
定位:超过 threshold 的文件已落临时盘,堆内存仅承载缓冲与元数据;但整请求流式读入仍受 maxSize 保护。 解决:合理设置 maxSize/maxFileSize(见《配置参数详解》七、节模板),而非盲目加大堆。
十一、参考链接
- Apache Commons FileUpload 官网:https://commons.apache.org/proper/commons-fileupload/
- 官方 bin 发布目录:https://downloads.apache.org/commons/fileupload/binaries/
- JDK 工具(jar/javac/java)文档:https://docs.oracle.com/en/java/javase/17/tools/
- curl 手册:https://curl.se/docs/manpage.html
- Maven 依赖插件文档:https://maven.apache.org/plugins/maven-dependency-plugin/