#!/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 "$@"