更新编译脚本与说明书
This commit is contained in:
@@ -1,61 +1,82 @@
|
||||
#!/bin/bash
|
||||
# AuthCenter 编译脚本(Termux专属适配)
|
||||
# 目录:脚本放AuthCenterConsoleApp根目录,同目录含src/、libs/、runtime/
|
||||
# 解决Termux下jar包classpath拼接报错问题
|
||||
# AuthCenter 编译+启动一体化脚本(Termux专属)
|
||||
# 特性:任意目录可执行、自动定位项目根、清空旧class、全日志输出
|
||||
# 放置位置:AuthCenterConsoleApp/bash/ 下(任意位置也能跑)
|
||||
|
||||
# 锚定AuthCenterConsoleApp根目录(脚本所在目录)
|
||||
BASE_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)
|
||||
# 核心:自动定位项目根目录(无论脚本放哪/在哪执行,都能精准找到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}" = "/" ]; 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"
|
||||
MAIN_CLASS="Main" # 主类名
|
||||
|
||||
# 前置校验:必须有src目录
|
||||
# 前置校验
|
||||
if [ ! -d "${SRC_DIR}" ]; then
|
||||
echo "❌ 错误:根目录[${BASE_DIR}]下无src目录,请核对结构"
|
||||
echo "❌ 项目根目录[${BASE_DIR}]下无src目录,请核对结构"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 查找所有Java源文件
|
||||
# 查找Java源文件
|
||||
JAVA_FILES=$(find "${SRC_DIR}" -name "*.java")
|
||||
if [ -z "${JAVA_FILES}" ]; then
|
||||
echo "❌ 错误:src目录下无.java文件"
|
||||
echo "❌ src目录下无.java源文件"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 核心修正:Termux兼容的classpath拼接(用循环拼接,避免空格/路径解析问题)
|
||||
# 1. 清空旧文件+建目录
|
||||
echo "🧹 清理旧编译文件..."
|
||||
rm -rf "${OUT_DIR}"/*
|
||||
mkdir -p "${OUT_DIR}" "${LOG_DIR}"
|
||||
|
||||
# 2. 拼接classpath(Termux兼容,含依赖+输出目录)
|
||||
CP_PARAM=""
|
||||
if [ -d "${LIB_DIR}" ]; then
|
||||
JAR_LIST=("${LIB_DIR}"/*.jar)
|
||||
# 排除目录本身(无jar时不拼接)
|
||||
if [ -f "${JAR_LIST[0]}" ]; then
|
||||
CP=$(IFS=:; echo "${JAR_LIST[*]}")
|
||||
CP="${OUT_DIR}:$(IFS=:; echo "${JAR_LIST[*]}")"
|
||||
CP_PARAM="-cp ${CP}"
|
||||
else
|
||||
echo "ℹ️ 提示:libs目录无jar包,无依赖编译"
|
||||
echo "ℹ️ libs目录无jar包,无依赖编译"
|
||||
CP_PARAM="-cp ${OUT_DIR}"
|
||||
fi
|
||||
else
|
||||
echo "ℹ️ 提示:无libs目录,无依赖编译"
|
||||
echo "ℹ️ 无libs目录,无依赖编译"
|
||||
CP_PARAM="-cp ${OUT_DIR}"
|
||||
fi
|
||||
|
||||
# 创建输出目录
|
||||
mkdir -p "${OUT_DIR}"
|
||||
|
||||
# 打印目录信息
|
||||
echo "📌 编译目录信息"
|
||||
# 3. 打印目录信息
|
||||
echo "📌 项目目录信息"
|
||||
echo " 根目录 :${BASE_DIR}"
|
||||
echo " 源码目录:${SRC_DIR}($(echo "${JAVA_FILES}" | wc -l | tr -d ' ')个文件)"
|
||||
echo " 源码数 :$(echo "${JAVA_FILES}" | wc -l | tr -d ' ')"
|
||||
echo " 输出目录:${OUT_DIR}"
|
||||
echo "------------------------------------------------------------------------"
|
||||
|
||||
# 执行编译(Java7标准+UTF-8,适配Termux)
|
||||
echo "开始编译(适配Termux+Java7)..."
|
||||
# 4. 编译源码
|
||||
echo "开始编译(Termux+Java7兼容)..."
|
||||
javac -encoding UTF-8 -source 1.7 -target 1.7 ${CP_PARAM} -d "${OUT_DIR}" ${JAVA_FILES}
|
||||
|
||||
# 结果校验
|
||||
if [ $? -eq 0 ]; then
|
||||
echo -e "\n✅ 编译成功!class文件在 runtime 目录"
|
||||
else
|
||||
echo -e "\n❌ 编译失败!排查方向:1.JDK≥1.7 2.源码语法 3.jar包是否有效"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo -e "\n❌ 编译失败!排查:JDK版本、源码语法、libs依赖包"
|
||||
exit 1
|
||||
fi
|
||||
echo -e "\n✅ 编译成功!"
|
||||
|
||||
# 5. 启动程序(全日志输出到logs目录)
|
||||
echo "------------------------------------------------------------------------"
|
||||
echo "🚀 启动程序...日志输出至 ${LOG_DIR}/winboll_all.log"
|
||||
java -cp "${OUT_DIR}:${LIB_DIR}/*" ${MAIN_CLASS} > "${LOG_DIR}/winboll_all.log" 2>&1
|
||||
|
||||
@@ -9,15 +9,19 @@ MAIN_LOG="$LOG_DIR/main.log"
|
||||
# 1. 前置准备:创建日志目录(仅给Java LogUtils用,脚本不再写日志)
|
||||
mkdir -p "$LOG_DIR" || { echo "日志目录创建失败"; exit 1; }
|
||||
|
||||
# 2. 编译校验
|
||||
# 2. 编译校验(核心修正:匹配真实Main.class路径,避免误判编译失败)
|
||||
BUILD_SH="$BASE_DIR/bash/build_class.sh"
|
||||
if [ ! -f "$BUILD_SH" ]; then
|
||||
echo "编译脚本不存在:$BUILD_SH"
|
||||
exit 1
|
||||
fi
|
||||
bash "$BUILD_SH" || { echo "编译失败退出"; exit 1; }
|
||||
bash "$BUILD_SH"
|
||||
if [ $? -ne 0 ] && [ ! -f "$BASE_DIR/runtime/cc/winboll/Main.class" ]; then
|
||||
echo "编译失败退出"; exit 1
|
||||
fi
|
||||
echo "✅ 编译校验通过"
|
||||
|
||||
# 3. 类路径配置(指定完整包名主类)
|
||||
# 3. 类路径+主类配置(核心修正:主类用完整包名,适配目录结构)
|
||||
CLASSPATH="$BASE_DIR/runtime"
|
||||
[ -d "$BASE_DIR/libs" ] && CLASSPATH="$CLASSPATH:$BASE_DIR/libs/*"
|
||||
MAIN_CLASS="cc.winboll.Main"
|
||||
@@ -27,11 +31,11 @@ export _JAVA_OPTIONS="-Xmx128m -Xms64m -Dfile.encoding=UTF-8"
|
||||
STOP_SIGNAL=0
|
||||
JAVA_PID=0
|
||||
|
||||
# 5. 信号捕获:优雅停机+终端重置
|
||||
# 5. 信号捕获:优雅停机+终端重置,避免卡空行
|
||||
on_exit() {
|
||||
STOP_SIGNAL=1
|
||||
echo -e "\n⚠️ 收到停止信号,正在优雅停机..."
|
||||
# 向Java进程发送中断信号
|
||||
# 优雅终止Java进程
|
||||
if [ $JAVA_PID -ne 0 ]; then
|
||||
kill -INT $JAVA_PID 2>/dev/null
|
||||
sleep 1
|
||||
@@ -39,14 +43,14 @@ on_exit() {
|
||||
fi
|
||||
stty sane
|
||||
echo -e "✅ 服务已停止,Java日志文件:$MAIN_LOG"
|
||||
exit 1
|
||||
exit 0
|
||||
}
|
||||
trap 'on_exit' SIGINT SIGTERM SIGABRT SIGSEGV SIGILL
|
||||
|
||||
# 6. 启动服务(核心修改:移除所有日志重定向,stdout/stderr直接走终端)
|
||||
stty -echoctl # 屏蔽^C视觉印记
|
||||
# 6. 启动服务(无日志重定向,保留终端交互,屏蔽^C印记)
|
||||
stty -echoctl
|
||||
echo -e "🚀 服务启动中,输入help查指令,输入exit优雅停机"
|
||||
echo -e "📝 Java日志输出路径:$MAIN_LOG\n"
|
||||
|
||||
# 关键:无任何重定向,让Java的LogUtils负责写日志,终端保留完整交互能力
|
||||
# 启动核心命令
|
||||
java -cp "$CLASSPATH" "$MAIN_CLASS" -v -log:ALL
|
||||
|
||||
@@ -9,15 +9,19 @@ MAIN_LOG="$LOG_DIR/main.log"
|
||||
# 1. 前置准备:创建日志目录(仅给Java LogUtils用,脚本不再写日志)
|
||||
mkdir -p "$LOG_DIR" || { echo "日志目录创建失败"; exit 1; }
|
||||
|
||||
# 2. 编译校验
|
||||
# 2. 编译校验(核心修正:匹配真实Main.class路径,避免误判编译失败)
|
||||
BUILD_SH="$BASE_DIR/bash/build_class.sh"
|
||||
if [ ! -f "$BUILD_SH" ]; then
|
||||
echo "编译脚本不存在:$BUILD_SH"
|
||||
exit 1
|
||||
fi
|
||||
bash "$BUILD_SH" || { echo "编译失败退出"; exit 1; }
|
||||
bash "$BUILD_SH"
|
||||
if [ $? -ne 0 ] && [ ! -f "$BASE_DIR/runtime/cc/winboll/Main.class" ]; then
|
||||
echo "编译失败退出"; exit 1
|
||||
fi
|
||||
echo "✅ 编译校验通过"
|
||||
|
||||
# 3. 类路径配置(指定完整包名主类)
|
||||
# 3. 类路径+主类配置(核心修正:主类用完整包名,适配目录结构)
|
||||
CLASSPATH="$BASE_DIR/runtime"
|
||||
[ -d "$BASE_DIR/libs" ] && CLASSPATH="$CLASSPATH:$BASE_DIR/libs/*"
|
||||
MAIN_CLASS="cc.winboll.Main"
|
||||
@@ -27,11 +31,11 @@ export _JAVA_OPTIONS="-Xmx128m -Xms64m -Dfile.encoding=UTF-8"
|
||||
STOP_SIGNAL=0
|
||||
JAVA_PID=0
|
||||
|
||||
# 5. 信号捕获:优雅停机+终端重置
|
||||
# 5. 信号捕获:优雅停机+终端重置,避免卡空行
|
||||
on_exit() {
|
||||
STOP_SIGNAL=1
|
||||
echo -e "\n⚠️ 收到停止信号,正在优雅停机..."
|
||||
# 向Java进程发送中断信号
|
||||
# 优雅终止Java进程
|
||||
if [ $JAVA_PID -ne 0 ]; then
|
||||
kill -INT $JAVA_PID 2>/dev/null
|
||||
sleep 1
|
||||
@@ -39,14 +43,14 @@ on_exit() {
|
||||
fi
|
||||
stty sane
|
||||
echo -e "✅ 服务已停止,Java日志文件:$MAIN_LOG"
|
||||
exit 1
|
||||
exit 0
|
||||
}
|
||||
trap 'on_exit' SIGINT SIGTERM SIGABRT SIGSEGV SIGILL
|
||||
|
||||
# 6. 启动服务(核心修改:移除所有日志重定向,stdout/stderr直接走终端)
|
||||
stty -echoctl # 屏蔽^C视觉印记
|
||||
# 6. 启动服务(无日志重定向,保留终端交互,屏蔽^C印记)
|
||||
stty -echoctl
|
||||
echo -e "🚀 服务启动中,输入help查指令,输入exit优雅停机"
|
||||
echo -e "📝 Java日志输出路径:$MAIN_LOG\n"
|
||||
|
||||
# 关键:无任何重定向,让Java的LogUtils负责写日志,终端保留完整交互能力
|
||||
# 启动核心命令
|
||||
java -cp "$CLASSPATH" "$MAIN_CLASS" -v -log:INFO
|
||||
|
||||
Reference in New Issue
Block a user