#!/bin/bash # 查找项目根目录(向上找含src文件夹的目录) find_project_root() { # 修复:命令执行用$(),变量引用加$ local current_dir=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd) # 修复:循环条件(找src目录,找不到就向上退,到根目录停止) while [ ! -d "${current_dir}/src" ] && [ "${current_dir}" != "/" ]; do current_dir=$(dirname "${current_dir}") done if [ "${current_dir}" = "/" ] && [ ! -d "${current_dir}/src" ]; then echo "❌ 未找到项目根目录(无src文件夹)" exit 1 fi echo "${current_dir}" } # 基础目录定义(修复变量引用) BASE_DIR=$(find_project_root) SRC_DIR="${BASE_DIR}/src" LIB_DIR="${BASE_DIR}/libs" OUT_DIR="${BASE_DIR}/runtime" LOG_DIR="${BASE_DIR}/logs" JAR_DIR="${BASE_DIR}/jar" MAIN_CLASS="Main" # 修复:补全全类名(必须包名+类名,否则运行报错) JAR_NAME="AuthCenter-$(date +%Y%m%d%H%M).jar" MANIFEST_FILE="${OUT_DIR}/MANIFEST.MF" # 校验src目录 if [ ! -d "${SRC_DIR}" ]; then echo "❌ 项目根目录[${BASE_DIR}]下无src目录,请核对结构" exit 1 fi # 查找所有java源文件(修复:命令执行+判空) JAVA_FILES=$(find "${SRC_DIR}" -name "*.java") if [ -z "${JAVA_FILES}" ]; then echo "❌ src目录下无.java源文件" exit 1 fi # 创建目录(修复:引号统一,避免空格问题) mkdir -p "${OUT_DIR}" "${LOG_DIR}" "${JAR_DIR}" # 构建classpath(修复依赖查找+拼接逻辑) CP_PARAM="" LIB_CP="" if [ -d "${LIB_DIR}" ]; then # 修复:加*匹配所有jar包 JAR_LIST=(${LIB_DIR}/*.jar) # 修复:判断是否有jar包 if [ -f "${JAR_LIST[0]}" ]; then # 修复:依赖路径拼接 LIB_CP=$(IFS=:; echo "${JAR_LIST[*]}") CP="${OUT_DIR}:${LIB_CP}" CP_PARAM="-cp ${CP}" else echo "ℹ️ libs目录无jar包,无依赖编译" CP_PARAM="-cp ${OUT_DIR}" fi else echo "ℹ️ 无libs目录,无依赖编译" CP_PARAM="-cp ${OUT_DIR}" fi # 打印目录信息(修复:源码数统计命令执行) echo "📌 项目目录信息" echo " 根目录 :${BASE_DIR}" echo " 源码数 :$(echo "${JAVA_FILES}" | wc -l | tr -d ' ')" echo " 输出目录:${OUT_DIR}" echo " JAR输出 :${JAR_DIR}/${JAR_NAME}" echo "------------------------------------------------------------------------" # 编译源码(修复:变量引用+参数格式) echo "开始编译(Termux+Java7兼容)..." javac -encoding UTF-8 -source 1.7 -target 1.7 ${CP_PARAM} -d "${OUT_DIR}" ${JAVA_FILES} if [ $? -ne 0 ]; then echo -e "\n❌ 编译失败!排查:JDK版本、源码语法、libs依赖包" exit 1 fi echo -e "\n✅ 编译成功!" # 生成MANIFEST清单(修复:变量引用+路径处理) echo "📝 生成MANIFEST清单文件..." echo "Manifest-Version: 1.0" > ${MANIFEST_FILE} echo "Main-Class: ${MAIN_CLASS}" >> ${MANIFEST_FILE} if [ -n "${LIB_CP}" ]; then # 修复:依赖路径格式化,适配JAR清单 echo "Class-Path: $(echo ${LIB_CP} | sed "s|${BASE_DIR}/||g" | tr ':' ' ')" >> ${MANIFEST_FILE} fi # 打包可运行JAR(修复:变量引用+静默打包) echo "📦 打包可运行JAR文件..." cd ${OUT_DIR} && jar cvfm "${JAR_DIR}/${JAR_NAME}" "${MANIFEST_FILE}" ./* >/dev/null 2>&1 if [ $? -ne 0 ]; then echo -e "\n❌ JAR打包失败!" exit 1 fi echo -e "✅ JAR打包成功!路径:${JAR_DIR}/${JAR_NAME}"