
很多 Java 开发者都有过这种尴尬场景人在地铁、高铁或者医院候诊室突然想验证一个语法细节、跑通一个刚看到的小 Demo或者给同事远程演示一个接口效果可手边没有电脑。打开手机装一个完整 IDE动辄几百 MB装完以后手机发烫、存储吃紧体验谈不上好用在线编译器又受网络和依赖库限制。其实手机完全可以承担一部分 Java 开发验证工作关键是不要一上来就装“手机 IDE”而是走一条更工程化的路Termux 终端 JDK Maven 一套构建脚本。我在这篇文章里要给出的判断是手机构建 Java 项目脚本真正解决的问题不是“让手机替代电脑”而是把环境检查、依赖下载、编译打包、运行验证这几个步骤固化成脚本让手机上的 Java 开发体验无限接近 PC 命令行环境。这套方案最核心的价值有三个可重复、可定时、可分享。环境检查脚本跑一遍哪缺什么一目了然构建脚本跑一遍项目直接从源码变成 jar 包再加一个一键脚本整个流程自动串起来。文章会从 Termux 环境搭建开始讲清 JDK、Maven 的安装方式然后给出一套可以直接复制使用的 Shell 脚本最后补充常见问题排查和最佳实践。无论你是 Java 学习者还是需要临时维护小工具的开发者都可以照着做一遍。1. 为什么要做“手机构建 Java 项目脚本”1.1 没有电脑时的 Java 验证需求比想象中多日常开发中“手边暂时没有电脑”这个需求点经常被忽略。你可能只是想知道某个 Java 字符串 API 的返回值可能想验证一个简单的算法思路也可能需要在项目现场临时跑一个打包好的 jar 包演示效果。这些需求都称不上“大型开发”但它们真实存在。在 PC 上完成这些动作只需要几秒钟打开 IDEA写一个 main 方法点击运行。可一旦场景切换到手机整个流程就变得笨重。手机上的在线编译器普遍只支持单文件运行无法处理带依赖的 Maven 项目App 版 Java IDE 虽然存在但在小屏幕上操作工程结构、管理依赖、查看构建日志效率并不高。1.2 传统方案有哪些不足手机端做 Java 开发多数人第一反应是安装手机版 IDE。这类工具确实做到了“能写代码”但实际体验往往集中在三个痛点上。第一是存储和性能压力。完整 IDE 安装后占用空间大构建大型项目时 CPU 和内存占用居高不下手机发热明显。第二是工程能力弱。手机版 IDE 对 Maven、Gradle 多模块项目的支持有限很多插件体系也无法完整迁移。第三是输出不可复用。在 IDE 里点一次“运行”得到的只是结果中间的环境检查、构建参数、运行命令都没有沉淀下来换个项目又要重新点一遍。1.3 脚本化方案的本质收益把 Java 项目构建过程写成脚本本质上是在做“流程标准化”。环境检查脚本可以随时确认 JDK 和 Maven 是否可用构建脚本把 mvn clean package 和日志输出固定下来运行脚本统一管理 jar 包启动参数。这些脚本一旦写好可以直接在手机上反复使用也可以同步到 Git 仓库换设备之后拉下来就恢复整套能力。另外脚本方案还有一个隐藏优势它是命令行的天然适合被其他工具调用。你可以让它在凌晨自动执行可以把构建结果输出到日志文件可以在构建失败时用手机通知接口提醒自己。这些能力在手机 IDE 里几乎不可能实现。1.4 这套方案适合谁不适合谁如果你的需求是学习 Java 基础、验证小型算法、构建单模块 Maven 项目、临时运行 jar 包这套方案很划算。如果你的项目包含大量微服务、依赖本机 Docker 和数据库、需要频繁调试复杂多模块工程手机端的脚本方案就不太合适建议还是回到 PC 或远程服务器上开发。2. 核心概念终端环境、构建工具与脚本化流程2.1 TermuxAndroid 上的 Linux 终端环境Termux 是 Android 平台上一款终端模拟器它不只是“一个能敲命令的 App”而是一个完整的 Linux 用户空间环境。通过自带的 pkg 包管理器你可以安装 Python、Node.js、Git、JDK、Maven 等大量开发工具最终得到一个接近桌面 Linux 发行版的命令行环境。Termux 有一个重要特点默认不要求 root 权限所有软件包都安装在应用私有目录下这让它既安全又不破坏手机系统。安装 JDK、Maven 等开发工具的过程和 Linux 上使用 apt 安装软件非常相似。2.2 JDK 与 Maven 在构建链路中的分工JDKJava Development Kit是 Java 开发的基石它提供了 java 运行命令、javac 编译命令以及一整套标准类库。在手机端安装 openjdk 包就相当于把 Java 编译运行能力搬到了终端里。Maven 是 Java 领域最常用的构建工具之一负责管理依赖、编译源码、执行测试、打包产物。它通过 pom.xml 文件描述项目依赖和构建规则。简单理解JDK 负责“把 Java 源码变成可执行字节码”Maven 则负责“在编译之前把依赖的 jar 包下载好在编译之后把产物打包好”。2.3 构建脚本到底在构建什么构建脚本不是重复执行 mvn package 那么简单。一套合格的构建脚本通常包含以下几层逻辑环境检查确认 java、javac、mvn、git 等关键命令存在。参数准备确定项目目录、日志目录、构建参数。依赖处理调用 Maven 下载依赖并处理网络超时、镜像源问题。构建执行执行编译、测试、打包。结果验证检查产物 jar 包是否生成输出日志位置。脚本化最大的意义在于“把流程显式化”。没有脚本时每一步依赖人的记忆有了脚本每个环节都被确定下来任何一次构建都有日志可查任何一步失败都会准确地暴露出来。2.4 手机端和 PC 端构建的主要差异手机端构建和 PC 端构建的步骤基本一致但有几个差异需要格外注意。第一是路径体系不同Termux 的用户目录是/data/data/com.termux/files/home脚本中最好不要硬编码路径而是使用$HOME和$PREFIX。第二是内存资源更紧张Maven 构建时需要通过 MAVEN_OPTS 控制堆内存上限避免 OOM。第三是网络环境不稳定依赖包下载慢是常态需要配置国内镜像源。3. 环境准备与前置条件3.1 硬件要求这套方案不需要旗舰手机但建议预留足够空间。JDK 安装后约占几百 MBMaven 和 Gradle 等工具以及本地 Maven 仓库会继续占用空间建议至少预留 2 到 3 GB 可用存储。Android 系统版本建议 7.0 以上版本过旧可能导致 Termux 无法正常运行。3.2 安装 TermuxTermux 推荐从 F-Droid 渠道下载安装因为 F-Droid 版本更新及时且不受应用商店审核策略影响。安装后打开 App会进入一个 Linux shell 界面。进入后先执行两条命令把软件源索引和已安装软件包更新到最新pkg update pkg upgrade更新过程中如果提示确认直接输入y回车即可。这一步可能耗时较长取决于网络速度。3.3 安装 JDK、Maven 和 GitTermux 的 pkg 仓库中已经收录了 openjdk 和 maven直接安装即可。演示使用 openjdk-17版本请以实际安装为准本文重点演示通用思路。pkg install openjdk-17 maven git安装完成后验证关键命令是否可用java -version javac -version mvn -version git --version如果输出对应版本信息说明环境已经就绪。3.4 配置环境变量Termux 安装 openjdk 后java 命令通常已经被放在$PREFIX/bin目录下。为了让 Maven 和其他工具能正确识别 JDK建议在~/.bashrc中补充环境变量配置。编辑文件nano ~/.bashrc在文件末尾追加export JAVA_HOME$PREFIX export PATH$JAVA_HOME/bin:$PATH保存后执行source ~/.bashrc然后再次执行echo $JAVA_HOME确认输出不是空值。3.5 创建项目目录建议把项目统一放在$HOME/projects目录下方便脚本统一管理mkdir -p ~/projects ~/logs ~/scripts后续所有项目都放在~/projects下构建日志输出到~/logs脚本文件统一放在~/scripts或项目内的scripts目录。4. 构建脚本整体设计与流程拆解4.1 脚本设计的分层思路手机端构建脚本不推荐写成一个大而全的文件。更合理的做法是按职责拆分为四个文件脚本文件职责env_check.sh检查 Java、Maven、Git 等命令是否可用build.sh进入项目目录执行 Maven 编译打包run.sh运行构建产物 jar 包并传入演示参数mobile-build.sh一键脚本串联环境检查、构建、运行三步这样做的好处是每个脚本都可以单独调试。环境检查出问题不需要连带构建一起重跑构建出问题不需要浪费时间重新检查环境。4.2 流程拆解一键脚本是怎么执行起来的整体执行流程如下环境检查检测 java、javac、mvn、git 是否存在。目录校验确认传入的项目目录包含 pom.xml。创建日志目录确保构建日志有地方写入。执行 Maven 构建运行 mvn clean package 并输出到日志。检查产物列出 target 目录下生成的 jar 包。运行验证调用 java -jar 启动应用传入两个数字参数验证加法计算是否正常。每一步的输入输出都是清晰的环境检查脚本输出环境状态构建脚本输出 jar 包和日志运行脚本输出控制台结果。4.3 为什么要先做环境检查手机系统相比 PC 发行版更加精简很多开发者默认存在的命令在 Termux 里可能完全没有。比如某些精简版系统没有 curl某些版本没有 git。如果跳过环境检查直接构建Maven 报出来的错误可能让你排查半天才发现是基础命令缺失。环境检查脚本把这个过程提前能在构建前就明确告诉你是 java 没装还是 mvn 没装。4.4 脚本安全设计原则脚本中要避免删除指令、格式化指令等危险操作。清理项目产物统一使用 mvn clean不直接 rm -rf target。脚本统一使用set -euo pipefail遇到任何命令失败立即退出避免带着错误继续执行导致不可预期后果。5. 完整示例代码实现下面是一个可以直接跑通的最小 Java 项目。项目结构如下mobile-java-demo/ ├── pom.xml ├── scripts/ │ ├── env_check.sh │ ├── build.sh │ ├── run.sh │ └── mobile-build.sh └── src/main/java/com/example/demo/App.java请依次创建文件和目录。5.1 pom.xml 配置文件路径mobile-java-demo/pom.xmlproject xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdcom.example/groupId artifactIdmobile-java-demo/artifactId version1.0-SNAPSHOT/version packagingjar/packaging properties maven.compiler.source17/maven.compiler.source maven.compiler.target17/maven.compiler.target project.build.sourceEncodingUTF-8/project.build.sourceEncoding /properties build finalNamemobile-java-demo/finalName plugins plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-jar-plugin/artifactId version3.4.1/version configuration archive manifest mainClasscom.example.demo.App/mainClass /manifest /archive /configuration /plugin /plugins /build /project这段配置的关键点是maven.compiler.source和maven.compiler.target都指定为 17和手机端安装的 openjdk-17 保持一致。如果手机上安装的是 JDK 11需要同步修改这两个值。mainClass指向程序的入口类这是 jar 包能通过java -jar直接启动的前提。5.2 Java 演示程序文件路径mobile-java-demo/src/main/java/com/example/demo/App.javapackage com.example.demo; public class App { public static void main(String[] args) { if (args.length 2) { System.err.println(用法: java -jar mobile-java-demo.jar 数字1 数字2); System.exit(1); } try { double a Double.parseDouble(args[0]); double b Double.parseDouble(args[1]); System.out.println(计算结果: a b (a b)); } catch (NumberFormatException e) { System.err.println(输入的不是有效数字: e.getMessage()); System.exit(2); } } }这个程序的功能非常简单从命令行接收两个数字输出它们的和。它足够简单适合验证手机端从源码到 jar 包的完整链路。程序里包含了参数校验、异常处理、退出码区分能演示 Java 程序在无图形界面环境下的标准行为。5.3 环境检查脚本文件路径mobile-java-demo/scripts/env_check.sh#!/usr/bin/env bash # 用途: 检查手机端 Java 构建所需的基础命令 # 用法: bash scripts/env_check.sh set -euo pipefail RED\033[0;31m GREEN\033[0;32m NC\033[0m check_command() { local cmd$1 if command -v $cmd /dev/null 21; then echo -e [${GREEN}OK${NC}] $cmd else echo -e [${RED}MISSING${NC}] $cmd return 1 fi } echo 环境检查开始: $(date) check_command java check_command javac check_command mvn check_command git echo 环境检查结束 if [ -n ${JAVA_HOME:-} ]; then echo JAVA_HOME$JAVA_HOME else echo 警告: JAVA_HOME 未设置。如果 java 可用请在 ~/.bashrc 中补充环境变量。 fi这段脚本的核心是check_command函数。它通过command -v判断指定命令是否存在于 PATH 中并在终端里输出绿字或红字提示。set -euo pipefail保证只要有一个必要命令缺失脚本立即返回非零退出码后续构建流程不再继续。5.4 构建脚本文件路径mobile-java-demo/scripts/build.sh#!/usr/bin/env bash # 用途: 使用 Maven 编译、测试并打包 Java 项目 # 用法: bash scripts/build.sh [项目目录] set -euo pipefail PROJECT_DIR${1:-$HOME/mobile-java-demo} TIMESTAMP$(date %Y%m%d-%H%M%S) BUILD_LOG$HOME/logs/mobile-build-$TIMESTAMP.log mkdir -p $HOME/logs if [ ! -f $PROJECT_DIR/pom.xml ]; then echo 错误: 在 $PROJECT_DIR 下没有找到 pom.xml exit 1 fi cd $PROJECT_DIR echo 构建项目: $PROJECT_DIR mvn clean package 21 | tee $BUILD_LOG echo 构建完成产物列表: ls -lh target/*.jar echo 日志文件: $BUILD_LOG脚本支持通过第一个参数传入项目目录不传时默认使用$HOME/mobile-java-demo。构建日志按时间戳命名每次构建都会生成独立日志文件。mvn clean package会依次执行清理、编译、测试、打包四个阶段。因为有set -o pipefail即使输出通过管道发给 teeMaven 的退出码也能被正确捕获。5.5 运行脚本文件路径mobile-java-demo/scripts/run.sh#!/usr/bin/env bash # 用途: 运行构建好的 jar 包 # 用法: bash scripts/run.sh [数字1] [数字2] set -euo pipefail PROJECT_DIR${MOBILE_JAVA_PROJECT:-$HOME/mobile-java-demo} JAR_PATH$PROJECT_DIR/target/mobile-java-demo.jar if [ ! -f $JAR_PATH ]; then echo 错误: 未找到 $JAR_PATH请先执行 build.sh 构建项目。 exit 1 fi a${1:-10} b${2:-20} java -jar $JAR_PATH $a $b运行脚本允许通过环境变量MOBILE_JAVA_PROJECT指定项目目录这样在多个项目之间切换时不需要修改脚本内容。脚本首先检查 jar 包是否存在如果不存在则提示先构建。默认参数是 10 和 20也可以手动传入任意两个数字。5.6 一键构建脚本文件路径mobile-java-demo/scripts/mobile-build.sh#!/usr/bin/env bash # 用途: 一键完成 环境检查 - 构建 - 运行 # 用法: bash scripts/mobile-build.sh set -euo pipefail SCRIPT_DIR$(cd $(dirname $0) pwd) PROJECT_DIR${MOBILE_JAVA_PROJECT:-$HOME/mobile-java-demo} echo 第 1 步: 环境检查 bash $SCRIPT_DIR/env_check.sh echo 第 2 步: 项目构建 bash $SCRIPT_DIR/build.sh $PROJECT_DIR echo 第 3 步: 运行验证 bash $SCRIPT_DIR/run.sh 10 20 echo 全部完成 一键脚本的作用是把前面三个独立脚本串成完整流程。由于每个子脚本都使用set -euo pipefail任何一步失败都会终止后续步骤符合“失败立即暴露”的原则。脚本目录通过dirname $0动态获取所以无论从哪个路径调用都能正确找到同级脚本。5.7 Maven 国内镜像配置如果依赖下载速度很慢可以为 Maven 配置国内镜像源。在用户目录下创建或编辑~/.m2/settings.xmlsettings xmlnshttp://maven.apache.org/SETTINGS/1.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd mirrors mirror idaliyun/id nameAliyun Maven Mirror/name urlhttps://maven.aliyun.com/repository/public/url mirrorOfcentral/mirrorOf /mirror /mirrors /settings配置完成后Maven 拉取依赖时会优先访问镜像源显著缩短构建等待时间。6. 运行结果与效果验证6.1 执行一键构建在 Termux 中进入项目目录cd ~/projects/mobile-java-demo bash scripts/mobile-build.sh首次执行时Maven 会下载大量依赖包耗时取决于网络状况。依赖下载完成后终端会依次输出环境检查、构建、运行三个阶段的信息。6.2 预期输出环境检查阶段正常时输出类似 环境检查开始: 2025-01-15 10:30:00 [OK] java [OK] javac [OK] mvn [OK] git 环境检查结束 JAVA_HOME/data/data/com.termux/files/usr构建阶段输出 Maven 执行日志最终出现构建完成产物列表: -rw-r--r-- 1 u0_a123 u0_a123 3821 Jan 15 10:31 /data/data/com.termux/files/home/mobile-java-demo/target/mobile-java-demo.jar 日志文件: /data/data/com.termux/files/home/logs/mobile-build-20250115-103000.log运行阶段输出计算结果: 10.0 20.0 30.0看到计算结果: 10.0 20.0 30.0说明整个链路已经成功运行。6.3 如何判断构建成功判断构建成功的标准有三个一是脚本最终打印了“全部完成”二是 target 目录下生成了 mobile-java-demo.jar 文件三是 jar 包可以正常用java -jar启动。任何一项不满足都说明流程中存在需要排查的问题。6.4 失败时第一步看哪里如果构建失败优先查看日志文件。构建日志路径在终端输出里会明确打印格式为$HOME/logs/mobile-build-时间戳.log。用nano或cat打开日志定位第一批出现 ERROR 的位置。大多数构建失败问题在日志前 20 行就能找到原因。7. 常见问题与排查思路问题现象可能原因排查方式解决方案java: command not foundJDK 未安装或 PATH 未配置执行java -version和echo $PATH执行pkg install openjdk-17并在 ~/.bashrc 导出 JAVA_HOMEJAVA_HOME 为空环境变量未写入配置文件执行echo $JAVA_HOME在 ~/.bashrc 追加 export JAVA_HOME$PREFIX执行 source 生效mvn: command not foundMaven 未安装执行which mvn执行pkg install maven构建提示源发行版 17 需要目标发行版 17JDK 版本与 pom.xml 编译器版本不一致执行mvn -v查看 JDK 版本将 pom.xml 中 maven.compiler.source 和 target 改为实际 JDK 版本构建时出现 OutOfMemoryError手机内存不足或 Maven 堆设置过小查看日志中错误堆栈设置export MAVEN_OPTS-Xmx512m降低内存占用Maven 下载依赖非常慢网络原因或未配置镜像观察日志中下载地址配置 ~/.m2/settings.xml 使用国内镜像脚本执行时报 Permission denied脚本文件没有执行权限执行ls -l scripts/给脚本添加执行权限chmod x scripts/*.sh构建成功但 jar 包运行无反应没有配置 mainClass 或打包方式不对检查 pom.xml 中 maven-jar-plugin 配置确认 mainClass 指向正确的类名并重新构建8. 最佳实践与工程建议8.1 脚本命名规范建议统一使用动词_对象.sh 的命名方式例如 env_check.sh、build.sh、run.sh、deploy.sh。脚本名中不要包含空格和特殊字符。放在独立 scripts 目录下与源码分离避免项目根目录过于杂乱。8.2 日志统一管理所有构建日志统一输出到$HOME/logs目录文件名带上时间戳。这样做的价值在问题排查时体现得最明显你可以按时间倒序查看每次构建记录快速定位“上一次成功构建是什么时候”“失败发生在哪个阶段”。8.3 环境变量集中管理不要在多个脚本里重复定义环境变量。更稳妥的方式是单独维护一个env.sh把 JAVA_HOME、MAVEN_OPTS、项目目录等变量统一放进去其他脚本通过 source 引入。未来调整 JDK 版本或切换项目时只需要改一个文件。# scripts/env.sh 示例 export JAVA_HOME$PREFIX export PATH$JAVA_HOME/bin:$PATH export MAVEN_OPTS-Xmx512m export MOBILE_JAVA_PROJECT$HOME/mobile-java-demo8.4 严格控制内存手机内存资源有限Maven 默认堆内存可能过大。建议在 env.sh 中设置MAVEN_OPTS-Xmx512m如果项目依赖特别多可以根据手机实际内存调整为 768m。不建议设置超过 1g否则构建过程中容易触发系统级别的进程回收。8.5 避免危险命令脚本中不要使用rm -rf清理目标目录统一交给mvn clean完成。不要使用sudoTermux 默认不依赖 root加上 sudo 反而可能引入不必要的问题。删除文件之前先确认路径变量不为空这是最基本的防御习惯。8.6 配合定时任务做自动化验证Termux 提供任务计划能力可以让手机在夜间自动拉取代码并执行构建。这种方式非常适合个人项目的持续验证每天凌晨自动构建一次起床后查看日志就能知道项目是否保持健康。构建失败时还可以通过 Termux 的通知接口发送一条提醒到手机通知栏不需要打开终端就能发现问题。8.7 版本兼容性管理JDK 版本、Maven 版本、项目编译级别三者必须保持一致。手机端升级 JDK 后第一件事就是回到 pom.xml 检查 maven.compiler.source 和 target。如果电脑上项目用的 Java 8手机上一律用 JDK 8 构建不要混用版本否则会出现“源发行版 17 需要目标发行版 17”这类对新手很不友好的警告。8.8 脚本纳入 Git 管理脚本和项目代码一样都应该提交到 Git 仓库。这样换手机或者在新设备上重新搭建环境时一条git clone就能把所有脚本和配置恢复。不要只在手机本地保存手机存储不是绝对可靠的备份介质。9. 总结与后续学习方向这套脚本方案真正解决的是“临时验证”和“轻量构建”这两类需求。环境检查脚本把环境状态变得可见构建脚本把 Maven 打包流程固定下来运行脚本统一管理 jar 包启动参数一键脚本再把三者串成完整链路。整个过程中你不再需要记住复杂的命令顺序也不用担心遗漏某个关键步骤。接下来你可以做几件事第一把这个最小示例改成自己的项目替换 App.java 里的业务逻辑第二在 pom.xml 中加入 Spring Boot 插件体验手机端打包可执行 jar 的完整流程第三把同样的脚本思路迁移到 Python、Node 或者其他语言的构建任务上你会发现这套“检查环境、执行构建、运行验证”的套路是通用的。如果你准备长期在手机上做 Java 轻量开发建议把这套脚本保存到自己的代码仓库并同步一份到电脑上维护。这样手机端和 PC 端用的是同一套构建流程编写、调试、验证的体验都保持一致项目不会再因为换了一台设备就变得难以构建。