|
1 | 1 | #!/bin/bash |
2 | 2 |
|
3 | | -# mvn build |
4 | | - |
5 | | -echo "start process services ..." |
6 | | -# 临时文件 |
7 | | -jars_file="/tmp/build-jars.txt" |
8 | | -non_app="/tmp/non-app.txt" |
9 | | - |
10 | | -# 根目录 |
11 | | -root_dir=$(pwd) |
12 | | - |
13 | | -# mod 依赖,容易变的依赖 |
14 | | -module_dir="${root_dir}/mod_lib" |
15 | | - |
16 | | -# 通用依赖,不易变的依赖 |
17 | | -lib_dir="${root_dir}/lib" |
18 | | - |
19 | | -# 服务目录 |
20 | | -services_dir="$(pwd)/services" |
21 | | - |
22 | | -# 清理 |
23 | | -rm -rf ${module_dir} |
24 | | -rm -rf ${lib_dir} |
25 | | -rm -rf ${services_dir} |
26 | | - |
27 | | -# enter 服务目录 |
28 | | -mkdir ${services_dir} |
29 | | -cd ${services_dir} |
30 | | - |
31 | | -# 查找所有 jar |
32 | | -find ${root_dir} -name "*.jar" >${jars_file} |
33 | | - |
34 | | -# 解压分层依赖 |
35 | | -awk '{print $1}' ${jars_file} | xargs -I {} java -Djarmode=layertools -jar {} extract 2>${non_app} |
36 | | - |
37 | | -# 合并分层依赖 |
38 | | -mkdir -p ${lib_dir} |
39 | | -mkdir -p ${module_dir} |
40 | | - |
41 | | -cp dependencies/BOOT-INF/lib/*.jar ${lib_dir}/ |
42 | | - |
43 | | -if [ -d "snapshot-dependencies/BOOT-INF/lib/" ]; then |
44 | | - cp snapshot-dependencies/BOOT-INF/lib/*.jar ${lib_dir}/ |
45 | | -fi |
46 | | - |
47 | | -# 合并 application 依赖到 mod 依赖 |
48 | | -if [ -d "application/BOOT-INF/lib/" ]; then |
49 | | - cp application/BOOT-INF/lib/*.jar ${module_dir}/ |
50 | | -fi |
51 | | - |
52 | | -# 合并本地模块依赖到 mod 依赖 |
53 | | -if [ -d "module-dependencies/BOOT-INF/lib/" ]; then |
54 | | - cp module-dependencies/BOOT-INF/lib/*.jar ${module_dir}/ |
55 | | -fi |
56 | | - |
57 | | -# 清理分层 |
58 | | -rm -rf application/ |
59 | | -rm -rf dependencies/ |
60 | | -rm -rf snapshot-dependencies/ |
61 | | -rm -rf spring-boot-loader/ |
62 | | -rm -rf module-dependencies/ |
63 | | - |
64 | | -# 创建服务执行目录 |
65 | | -cat ${jars_file} | while read line; do #cat命令的输出作为read命令的输入,read读到的值放在line中。line为读取文件行内容的变量 |
66 | | - service_name=$(echo ${line} | awk -F/ '{print $(NF-2)}') |
67 | | - if grep -q "${service_name}" ${non_app}; then |
68 | | - echo "non app ${service_name}" |
69 | | - else |
70 | | - # 服务目录 |
71 | | - echo "process service ${service_name}" |
72 | | - service_dir=$(pwd)/${service_name} |
73 | | - mkdir ${service_dir} |
74 | | - cd ${service_dir} |
75 | | - # 解压到服务目录 |
76 | | - unzip -q ${line} |
77 | | - rm -rf BOOT-INF/lib/* |
78 | | - # link all lib jars |
79 | | - cat "${service_dir}/BOOT-INF/classpath.idx" | while read layer_dep_path; do |
80 | | - if [[ "${layer_dep_path}" == *".jar"* ]]; then |
81 | | - # 移除双引号并提起 JAR 路径 |
82 | | - lib_path=$(echo $layer_dep_path | tr -d '"' | awk '{print $NF}') |
83 | | - # 获取 jar 名称 |
84 | | - lib_name=$(echo $lib_path | awk -F/ '{print $NF}') |
85 | | - # 创建软链接 |
86 | | - ln -s "${lib_dir}/$lib_name" $lib_path |
87 | | - fi |
88 | | - done |
89 | | - target_dir=$(dirname "${line}") |
90 | | - rm -rf ${target_dir} |
91 | | - # 返回上层目录 |
92 | | - cd .. |
93 | | - fi |
94 | | -done |
| 3 | +# 定义颜色输出 |
| 4 | +GREEN='\033[0;32m' |
| 5 | +RED='\033[0;31m' |
| 6 | +NC='\033[0m' # No Color |
| 7 | + |
| 8 | +# 定义全局变量 |
| 9 | +declare -r ROOT_DIR=$(pwd) |
| 10 | +declare -r EXTRACT_JAR_DIR="${ROOT_DIR}/extract_jar" |
| 11 | +declare -r MODULE_DIR="${ROOT_DIR}/mod_lib" # mod 依赖,容易变的依赖 |
| 12 | +declare -r LIB_DIR="${ROOT_DIR}/lib" # 通用依赖,不易变的依赖 |
| 13 | +declare -r SERVICES_DIR="${ROOT_DIR}/services" # 服务目录 |
| 14 | +declare -r JARS_FILE="/tmp/build-jars.txt" # 临时文件存储 jar 列表 |
| 15 | +declare -r NON_APP="/tmp/non-app.txt" # 临时文件存储非应用 jar |
| 16 | + |
| 17 | +# 输出日志函数 |
| 18 | +log_info() { |
| 19 | + echo -e "${GREEN}[INFO]${NC} $1" |
| 20 | +} |
| 21 | + |
| 22 | +log_error() { |
| 23 | + echo -e "${RED}[ERROR]${NC} $1" |
| 24 | +} |
| 25 | + |
| 26 | +# 清理旧文件和目录 |
| 27 | +cleanup_old_files() { |
| 28 | + log_info "清理旧文件和目录..." |
| 29 | + rm -rf "${MODULE_DIR}" "${LIB_DIR}" "${SERVICES_DIR}" |
| 30 | + mkdir -p "${SERVICES_DIR}" |
| 31 | +} |
| 32 | + |
| 33 | +# 查找所有 JAR 文件 |
| 34 | +find_all_jars() { |
| 35 | + log_info "查找所有 JAR 文件..." |
| 36 | + find "${ROOT_DIR}" -name "*.jar" > "${JARS_FILE}" |
| 37 | +} |
| 38 | + |
| 39 | +# 解压和合并依赖 |
| 40 | +extract_and_merge_dependencies() { |
| 41 | + log_info "解压和合并依赖..." |
| 42 | + |
| 43 | + # 使用新的推荐命令格式解压所有 JAR 文件 |
| 44 | + awk '{print $1}' "${JARS_FILE}" | xargs -I {} java -Djarmode=tools -jar {} extract --layers --launcher --force --destination ${EXTRACT_JAR_DIR} 2>"${NON_APP}" |
| 45 | + |
| 46 | + # 创建依赖目录 |
| 47 | + mkdir -p "${LIB_DIR}" "${MODULE_DIR}" |
| 48 | + |
| 49 | + # 复制依赖文件 |
| 50 | + cp ${EXTRACT_JAR_DIR}/dependencies/BOOT-INF/lib/*.jar "${LIB_DIR}/" |
| 51 | + |
| 52 | + # 处理快照依赖 |
| 53 | + if [ -d "${EXTRACT_JAR_DIR}/snapshot-dependencies/BOOT-INF/lib/" ]; then |
| 54 | + cp ${EXTRACT_JAR_DIR}/snapshot-dependencies/BOOT-INF/lib/*.jar "${LIB_DIR}/" |
| 55 | + fi |
| 56 | + |
| 57 | + # 处理应用依赖 |
| 58 | + if [ -d "${EXTRACT_JAR_DIR}/application/BOOT-INF/lib/" ]; then |
| 59 | + cp ${EXTRACT_JAR_DIR}/application/BOOT-INF/lib/*.jar "${MODULE_DIR}/" |
| 60 | + fi |
| 61 | + |
| 62 | + # 清理临时目录 |
| 63 | + rm -rf ${EXTRACT_JAR_DIR} |
| 64 | +} |
| 65 | + |
| 66 | +# 创建服务软链接 |
| 67 | +create_service_symlinks() { |
| 68 | + local service_name="$1" |
| 69 | + local service_dir="$2" |
| 70 | + |
| 71 | + cd "${service_dir}" || exit 1 |
| 72 | + |
| 73 | + while read -r layer_dep_path; do |
| 74 | + if [[ "${layer_dep_path}" == *".jar"* ]]; then |
| 75 | + # 移除双引号并提取 JAR 路径 |
| 76 | + local lib_path=$(echo "${layer_dep_path}" | tr -d '"' | awk '{print $NF}') |
| 77 | + # 获取 jar 名称 |
| 78 | + local lib_name=$(echo "${lib_path}" | awk -F/ '{print $NF}') |
| 79 | + # 创建软链接,使用 -f 强制创建并忽略错误输出 |
| 80 | + ln -sf "${LIB_DIR}/${lib_name}" "${lib_path}" 2>/dev/null |
| 81 | + fi |
| 82 | + done < "BOOT-INF/classpath.idx" |
| 83 | +} |
| 84 | + |
| 85 | +# 处理单个服务 |
| 86 | +process_service() { |
| 87 | + local jar_path="$1" |
| 88 | + local service_name=$(echo "${jar_path}" | awk -F/ '{print $(NF-2)}') |
| 89 | + |
| 90 | + if grep -q "${service_name}" "${NON_APP}"; then |
| 91 | + log_info "跳过非应用 JAR: ${service_name}" |
| 92 | + return |
| 93 | + fi |
| 94 | + |
| 95 | + log_info "处理服务: ${service_name}" |
| 96 | + local service_dir="${SERVICES_DIR}/${service_name}" |
| 97 | + mkdir -p "${service_dir}" |
| 98 | + |
| 99 | + # 解压 JAR 到服务目录 |
| 100 | + unzip -q "${jar_path}" -d "${service_dir}" |
| 101 | + rm -rf "${service_dir}/BOOT-INF/lib/*" |
| 102 | + |
| 103 | + # 创建依赖软链接 |
| 104 | + create_service_symlinks "${service_name}" "${service_dir}" |
| 105 | + |
| 106 | + # 清理原始 JAR 目录 |
| 107 | + local target_dir=$(dirname "${jar_path}") |
| 108 | + rm -rf "${target_dir}" |
| 109 | +} |
| 110 | + |
| 111 | +# 处理所有服务 |
| 112 | +process_all_services() { |
| 113 | + log_info "开始处理所有服务..." |
| 114 | + cd "${SERVICES_DIR}" || exit 1 |
| 115 | + |
| 116 | + while read -r jar_path; do |
| 117 | + process_service "${jar_path}" |
| 118 | + done < "${JARS_FILE}" |
| 119 | +} |
95 | 120 |
|
96 | 121 | # 清理临时文件 |
97 | | -rm -rf $non_app ${jars_file} |
| 122 | +cleanup_temp_files() { |
| 123 | + log_info "清理临时文件..." |
| 124 | + rm -f "${NON_APP}" "${JARS_FILE}" |
| 125 | +} |
| 126 | + |
| 127 | +# 显示目录结构 |
| 128 | +show_directory_structure() { |
| 129 | + log_info "当前目录结构:" |
| 130 | + echo -e "${GREEN}" |
| 131 | + tree -L 3 "${ROOT_DIR}" 2>/dev/null || { |
| 132 | + # 如果 tree 命令不可用,使用 ls 替代 |
| 133 | + find "${ROOT_DIR}" -maxdepth 3 -type d | sed 's/[^/]*\// /g' |
| 134 | + } |
| 135 | + echo -e "${NC}" |
| 136 | +} |
| 137 | + |
| 138 | +# 主函数 |
| 139 | +main() { |
| 140 | + log_info "开始构建服务..." |
| 141 | + |
| 142 | + cleanup_old_files |
| 143 | + find_all_jars |
| 144 | + extract_and_merge_dependencies |
| 145 | + process_all_services |
| 146 | + cleanup_temp_files |
| 147 | + log_info "构建完成!" |
| 148 | +} |
| 149 | + |
| 150 | +# 执行主函数 |
| 151 | +main |
0 commit comments