Skip to content

Commit cec2f3f

Browse files
committed
feat: update simple-user example and build.sh for spring-boot 3.x
1 parent c5b87e2 commit cec2f3f

File tree

5 files changed

+445
-283
lines changed

5 files changed

+445
-283
lines changed
Lines changed: 147 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,151 @@
11
#!/bin/bash
22

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+
}
95120

96121
# 清理临时文件
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

examples/simple-user/README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,16 +147,16 @@ http://localhost:9090/_docs/
147147
2. 用户服务调试页面:
148148
```
149149
# 创建用户
150-
http://localhost:9090/_docs/#/methods/demo.yoda.user.UserService/CreateUser/POST?debug_form_is_open=true
150+
http://localhost:9090/_docs/#/methods/simple.user.UserService/CreateUser/POST?debug_form_is_open=true
151151
152152
# 获取用户
153-
http://localhost:9090/_docs/#/methods/demo.yoda.user.UserService/GetUser/POST?debug_form_is_open=true
153+
http://localhost:9090/_docs/#/methods/simple.user.UserService/GetUser/POST?debug_form_is_open=true
154154
155155
# 更新用户
156-
http://localhost:9090/_docs/#/methods/demo.yoda.user.UserService/UpdateUser/POST?debug_form_is_open=true
156+
http://localhost:9090/_docs/#/methods/simple.user.UserService/UpdateUser/POST?debug_form_is_open=true
157157
158158
# 删除用户
159-
http://localhost:9090/_docs/#/methods/demo.yoda.user.UserService/DeleteUser/POST?debug_form_is_open=true
159+
http://localhost:9090/_docs/#/methods/simple.user.UserService/DeleteUser/POST?debug_form_is_open=true
160160
```
161161

162162
##### HTTP 访问 gRPC 服务

0 commit comments

Comments
 (0)