# DMS 一体化构建脚本(Java 版) # 用法:在项目根目录执行 .\build\build-java.ps1 # 产物:dist-package-java\dms-server\(dms-server.jar 内置前端) [CmdletBinding()] param( [switch]$SkipFrontend ) $ErrorActionPreference = "Stop" $ProjectRoot = Split-Path $PSScriptRoot -Parent $Backend = Join-Path $ProjectRoot "backend-java" $Frontend = Join-Path $ProjectRoot "frontend" $Dist = Join-Path $ProjectRoot "dist-package-java" $Templates = Join-Path $PSScriptRoot "java-templates" Write-Host "========== DMS 一体化构建(Java 版) ==========" -ForegroundColor Cyan Write-Host "项目根目录: $ProjectRoot" # ---------- 1. 前端构建 ---------- if (-not $SkipFrontend) { Write-Host "`n[1/4] 构建前端..." -ForegroundColor Yellow Push-Location $Frontend try { if (-not (Test-Path "node_modules")) { Write-Host " npm install..." -ForegroundColor DarkGray npm install if ($LASTEXITCODE -ne 0) { throw "npm install 失败" } } npm run build if ($LASTEXITCODE -ne 0) { throw "前端构建失败" } } finally { Pop-Location } } else { Write-Host "`n[1/4] 跳过前端构建 (-SkipFrontend)" -ForegroundColor DarkGray } $indexHtml = Join-Path $Frontend "dist\index.html" if (-not (Test-Path $indexHtml)) { throw "前端产物不存在: $indexHtml - 请先执行 npm run build" } # ---------- 2. Maven 打包(-Pfrontend 把前端 dist 合入 jar 的 static) ---------- Write-Host "`n[2/4] Maven 打包..." -ForegroundColor Yellow Push-Location $Backend try { mvn -q clean package -Pfrontend if ($LASTEXITCODE -ne 0) { throw "Maven 打包失败" } } finally { Pop-Location } $JarFile = Join-Path $Backend "target\dms-server.jar" if (-not (Test-Path $JarFile)) { throw "未找到打包产物: $JarFile" } # ---------- 3. 整理发行包 ---------- Write-Host "`n[3/4] 整理发行包..." -ForegroundColor Yellow $ReleaseDir = Join-Path $Dist "dms-server" if (Test-Path $ReleaseDir) { Remove-Item $ReleaseDir -Recurse -Force } New-Item $ReleaseDir -ItemType Directory | Out-Null Copy-Item $JarFile $ReleaseDir -Force # 配置模板与 Python 版共用同一份 .env.example Copy-Item (Join-Path $ProjectRoot "backend\.env.example") $ReleaseDir -Force # 启动/升级脚本与说明 Copy-Item (Join-Path $Templates "run.bat") $ReleaseDir -Force Copy-Item (Join-Path $Templates "run.sh") $ReleaseDir -Force Copy-Item (Join-Path $Templates "upgrade-db.bat") $ReleaseDir -Force Copy-Item (Join-Path $Templates "upgrade-db.sh") $ReleaseDir -Force Copy-Item (Join-Path $Templates "README.txt") $ReleaseDir -Force # 示例数据库 SQL(与后端语言无关,复用同一导出工具) $ExportTool = Join-Path $ProjectRoot "tools\export_full_demo_data.py" $ExportedSql = Join-Path $ReleaseDir "database-init.sql" if (Test-Path $ExportTool) { Write-Host " 导出示例数据库 SQL..." -ForegroundColor DarkGray Push-Location (Join-Path $ProjectRoot "backend") try { python $ExportTool --output $ExportedSql 2>&1 | Out-Host if (-not (Test-Path $ExportedSql)) { Write-Warning "导出工具未生成 $ExportedSql,请手动准备 SQL 文件" } } catch { Write-Warning "导出工具执行失败:$_" } finally { Pop-Location } } else { Write-Warning "未找到 tools\export_full_demo_data.py,跳过自动导出" } # ---------- 4. 从备份恢复 .env 和 dms-storage ---------- Write-Host "`n[4/4] 从备份恢复 .env 和 dms-storage..." -ForegroundColor Yellow $BackupDir = Join-Path $ProjectRoot "dist-package-java-bak\dms-server" if (-not (Test-Path $BackupDir)) { Write-Host " 备份目录不存在: $BackupDir - 跳过恢复" -ForegroundColor DarkGray } else { $BackupEnv = Join-Path $BackupDir ".env" if (Test-Path $BackupEnv) { Copy-Item $BackupEnv $ReleaseDir -Force Write-Host " 已恢复 .env" -ForegroundColor DarkGray } else { Write-Warning "备份中没有 .env,跳过" } $BackupStorage = Join-Path $BackupDir "dms-storage" if (Test-Path $BackupStorage) { $TargetStorage = Join-Path $ReleaseDir "dms-storage" if (Test-Path $TargetStorage) { Remove-Item $TargetStorage -Recurse -Force } Copy-Item $BackupStorage $TargetStorage -Recurse -Force Write-Host " 已恢复 dms-storage" -ForegroundColor DarkGray } else { Write-Warning "备份中没有 dms-storage,跳过" } } Write-Host "`n========== 构建完成(Java 版) ==========" -ForegroundColor Green Write-Host "发行包目录: $ReleaseDir" -ForegroundColor Green $sizeMB = [math]::Round((Get-ChildItem $ReleaseDir -Recurse | Measure-Object -Property Length -Sum).Sum / 1MB, 1) Write-Host "包大小: ${sizeMB} MB" -ForegroundColor Green Write-Host "将该目录整体压缩即可分发给最终用户" -ForegroundColor Green