- 更新script/README.md,增加详细的使用指南和最佳实践 - 新增simple-fix.sh脚本用于快速修复包名重复问题 - 新增fix-duplicate-packages.sh脚本专门处理重复包名检测和修复 - 新增fix-directory-structure.sh脚本用于重建目录结构 - 优化project-refactor.sh脚本,增强重复包名处理能力 - 完善脚本选择建议和问题排查步骤
286 lines
10 KiB
Bash
Executable File
286 lines
10 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# 目录结构修复脚本 - 专门修复重复包名目录问题
|
||
# Author: Leocoder
|
||
# Version: 1.0
|
||
|
||
# 颜色定义
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
PURPLE='\033[0;35m'
|
||
CYAN='\033[0;36m'
|
||
WHITE='\033[1;37m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# 全局变量
|
||
PROJECT_DIR=""
|
||
|
||
# 打印信息
|
||
print_step() {
|
||
echo -e "${BLUE}════════════════════════════════════════════════════════════════════════════════${NC}"
|
||
echo -e "${WHITE}$1${NC}"
|
||
echo -e "${BLUE}════════════════════════════════════════════════════════════════════════════════${NC}"
|
||
}
|
||
|
||
print_success() {
|
||
echo -e "${GREEN}✓ $1${NC}"
|
||
}
|
||
|
||
print_warning() {
|
||
echo -e "${YELLOW}⚠ $1${NC}"
|
||
}
|
||
|
||
print_error() {
|
||
echo -e "${RED}✗ $1${NC}"
|
||
}
|
||
|
||
print_info() {
|
||
echo -e "${PURPLE}ℹ $1${NC}"
|
||
}
|
||
|
||
# 获取项目目录
|
||
get_project_dir() {
|
||
if [ -z "$1" ]; then
|
||
PROJECT_DIR="$(pwd)"
|
||
else
|
||
PROJECT_DIR="$1"
|
||
fi
|
||
|
||
if [ ! -d "$PROJECT_DIR" ]; then
|
||
print_error "项目目录不存在: $PROJECT_DIR"
|
||
exit 1
|
||
fi
|
||
|
||
if [ ! -f "$PROJECT_DIR/pom.xml" ]; then
|
||
print_error "这不是一个Maven项目"
|
||
exit 1
|
||
fi
|
||
|
||
print_success "项目目录: $PROJECT_DIR"
|
||
}
|
||
|
||
# 备份重要文件
|
||
backup_files() {
|
||
print_step "步骤 1: 备份重要文件"
|
||
|
||
local backup_dir="/tmp/package_fix_backup_$(date +%Y%m%d_%H%M%S)"
|
||
mkdir -p "$backup_dir"
|
||
|
||
# 查找所有Java文件并备份
|
||
find "$PROJECT_DIR" -name "*.java" | while read java_file; do
|
||
local rel_path="${java_file#$PROJECT_DIR/}"
|
||
local target_file="$backup_dir/$rel_path"
|
||
mkdir -p "$(dirname "$target_file")"
|
||
cp "$java_file" "$target_file"
|
||
done
|
||
|
||
print_success "文件已备份到: $backup_dir"
|
||
}
|
||
|
||
# 收集所有Java文件
|
||
collect_java_files() {
|
||
print_step "步骤 2: 收集所有Java文件"
|
||
|
||
local temp_dir="/tmp/java_files_$(date +%Y%m%d_%H%M%S)"
|
||
mkdir -p "$temp_dir"
|
||
|
||
# 查找所有Java文件并复制到临时目录
|
||
find "$PROJECT_DIR" -name "*.java" -path "*/org/leocoder/*" | while read java_file; do
|
||
# 提取相对于org的路径
|
||
local rel_path=$(echo "$java_file" | sed 's|.*/org/leocoder/|org/leocoder/|')
|
||
local target_file="$temp_dir/$rel_path"
|
||
|
||
# 创建目标目录
|
||
mkdir -p "$(dirname "$target_file")"
|
||
|
||
# 复制文件
|
||
cp "$java_file" "$target_file"
|
||
|
||
print_info "收集文件: $rel_path"
|
||
done
|
||
|
||
echo "$temp_dir"
|
||
}
|
||
|
||
# 清理错误的目录结构
|
||
cleanup_wrong_structure() {
|
||
print_step "步骤 3: 清理错误的目录结构"
|
||
|
||
# 删除所有org目录
|
||
find "$PROJECT_DIR" -type d -name "org" -path "*/src/main/java/*" | while read org_dir; do
|
||
print_info "删除目录: $org_dir"
|
||
rm -rf "$org_dir"
|
||
done
|
||
|
||
print_success "已清理所有org目录"
|
||
}
|
||
|
||
# 重建正确的目录结构
|
||
rebuild_structure() {
|
||
print_step "步骤 4: 重建正确的目录结构"
|
||
|
||
local temp_dir="$1"
|
||
local count=0
|
||
|
||
# 查找所有Java源码目录
|
||
find "$PROJECT_DIR" -type d -path "*/src/main/java" | while read java_src_dir; do
|
||
print_info "处理目录: $java_src_dir"
|
||
|
||
# 在每个java目录下重建org/leocoder/estate结构
|
||
local target_base="$java_src_dir/org/leocoder/estate"
|
||
mkdir -p "$target_base"
|
||
|
||
# 从临时目录复制对应的文件
|
||
if [ -d "$temp_dir/org/leocoder/estate" ]; then
|
||
# 获取模块名称来判断应该复制哪些文件
|
||
local module_name=$(echo "$java_src_dir" | grep -o 'coder-estate-[^/]*' | head -1)
|
||
|
||
case "$module_name" in
|
||
"coder-estate-common")
|
||
if [ -d "$temp_dir/org/leocoder/estate/common" ]; then
|
||
cp -r "$temp_dir/org/leocoder/estate/common" "$target_base/"
|
||
print_info "复制common模块文件"
|
||
fi
|
||
;;
|
||
"coder-estate-model")
|
||
if [ -d "$temp_dir/org/leocoder/estate/domain" ]; then
|
||
cp -r "$temp_dir/org/leocoder/estate/domain" "$target_base/"
|
||
print_info "复制model模块文件"
|
||
fi
|
||
;;
|
||
"coder-estate-system")
|
||
if [ -d "$temp_dir/org/leocoder/estate/system" ]; then
|
||
cp -r "$temp_dir/org/leocoder/estate/system" "$target_base/"
|
||
print_info "复制system模块文件"
|
||
fi
|
||
;;
|
||
"coder-estate-web")
|
||
if [ -d "$temp_dir/org/leocoder/estate/web" ]; then
|
||
cp -r "$temp_dir/org/leocoder/estate/web" "$target_base/"
|
||
print_info "复制web模块文件"
|
||
fi
|
||
;;
|
||
"coder-estate-mybatisplus")
|
||
if [ -d "$temp_dir/org/leocoder/estate/mybatisplus" ]; then
|
||
cp -r "$temp_dir/org/leocoder/estate/mybatisplus" "$target_base/"
|
||
print_info "复制mybatisplus模块文件"
|
||
fi
|
||
;;
|
||
*plugin*)
|
||
# 处理插件模块
|
||
local plugin_type=$(echo "$module_name" | sed 's/coder-estate-//')
|
||
if [ -d "$temp_dir/org/leocoder/estate/$plugin_type" ]; then
|
||
cp -r "$temp_dir/org/leocoder/estate/$plugin_type" "$target_base/"
|
||
print_info "复制${plugin_type}插件文件"
|
||
fi
|
||
;;
|
||
esac
|
||
fi
|
||
|
||
((count++))
|
||
done
|
||
|
||
print_success "已重建 $count 个模块的目录结构"
|
||
}
|
||
|
||
# 修复文件内容中的包名
|
||
fix_package_names() {
|
||
print_step "步骤 5: 修复文件内容中的包名"
|
||
|
||
local count=0
|
||
|
||
# 查找所有Java文件并修复包名
|
||
find "$PROJECT_DIR" -name "*.java" -path "*/org/leocoder/estate/*" | while read java_file; do
|
||
# 检查是否包含错误的包名
|
||
if grep -q "org\.leocoder\.org\.leocoder" "$java_file"; then
|
||
print_info "修复包名: $(basename "$java_file")"
|
||
|
||
# 修复包名
|
||
sed -i '' 's|org\.leocoder\.org\.leocoder\.estate|org.leocoder.estate|g' "$java_file"
|
||
sed -i '' 's|org\.leocoder\.org\.leocoder|org.leocoder|g' "$java_file"
|
||
|
||
((count++))
|
||
fi
|
||
done
|
||
|
||
print_success "已修复 $count 个文件的包名"
|
||
}
|
||
|
||
# 验证修复结果
|
||
verify_result() {
|
||
print_step "步骤 6: 验证修复结果"
|
||
|
||
# 检查是否还有重复目录
|
||
local duplicate_dirs=$(find "$PROJECT_DIR" -type d -path "*/org/leocoder/org/leocoder*" 2>/dev/null)
|
||
if [ -n "$duplicate_dirs" ]; then
|
||
print_warning "仍然存在重复目录:"
|
||
echo "$duplicate_dirs"
|
||
return 1
|
||
fi
|
||
|
||
# 检查Java文件数量
|
||
local java_count=$(find "$PROJECT_DIR" -name "*.java" -path "*/org/leocoder/estate/*" | wc -l)
|
||
print_info "Java文件总数: $java_count"
|
||
|
||
# 检查模块结构
|
||
local modules=$(find "$PROJECT_DIR" -type d -path "*/src/main/java/org/leocoder/estate" | wc -l)
|
||
print_info "模块数量: $modules"
|
||
|
||
print_success "目录结构修复完成"
|
||
}
|
||
|
||
# 清理临时文件
|
||
cleanup_temp() {
|
||
local temp_dir="$1"
|
||
if [ -d "$temp_dir" ]; then
|
||
rm -rf "$temp_dir"
|
||
print_info "已清理临时文件"
|
||
fi
|
||
}
|
||
|
||
# 主函数
|
||
main() {
|
||
echo -e "${CYAN}"
|
||
echo "╔══════════════════════════════════════════════════════════════════════════════╗"
|
||
echo "║ 目录结构修复脚本 ║"
|
||
echo "║ Directory Structure Fix Tool ║"
|
||
echo "║ Version 1.0 ║"
|
||
echo "╚══════════════════════════════════════════════════════════════════════════════╝"
|
||
echo -e "${NC}"
|
||
|
||
get_project_dir "$1"
|
||
|
||
echo ""
|
||
echo -e "${YELLOW}警告: 此操作将重新组织项目目录结构,建议先备份项目!${NC}"
|
||
echo ""
|
||
read -p "是否继续? (y/N): " confirm
|
||
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
|
||
print_info "操作已取消"
|
||
exit 0
|
||
fi
|
||
|
||
# 执行修复步骤
|
||
backup_files
|
||
local temp_dir=$(collect_java_files)
|
||
cleanup_wrong_structure
|
||
rebuild_structure "$temp_dir"
|
||
fix_package_names
|
||
verify_result
|
||
cleanup_temp "$temp_dir"
|
||
|
||
echo -e "${GREEN}"
|
||
echo "╔══════════════════════════════════════════════════════════════════════════════╗"
|
||
echo "║ 目录结构修复完成! ║"
|
||
echo "║ ║"
|
||
echo "║ 下一步建议: ║"
|
||
echo "║ 1. 重新编译项目验证修复效果 ║"
|
||
echo "║ 2. 检查IDE中的导入语句 ║"
|
||
echo "║ 3. 运行测试确保功能正常 ║"
|
||
echo "╚══════════════════════════════════════════════════════════════════════════════╝"
|
||
echo -e "${NC}"
|
||
}
|
||
|
||
# 脚本入口
|
||
main "$@" |