首页 / 资讯中心 / 文章详情

Windows多模块Maven构建脚本设计与实战

Windows多模块Maven构建脚本设计与实战 ★ FEATURED ARTICLE
1. 为什么一个简单的“顺序执行mvn install”需要专门写bat脚本你有没有遇到过这样的场景手头同时维护着A、B、C三个Maven模块其中B依赖A的jar包C又依赖B的war包——它们不是父子聚合工程而是彼此独立、物理隔离的Git仓库。每次发版前你得手动打开三个命令行窗口依次进入A目录 →mvn clean install -Dmaven.test.skiptrue等它跑完再切到B目录 → 同样命令最后切到C目录 →mvn clean package -Dmaven.test.skiptrue。中间只要一个环节失败比如A编译报错、B的依赖解析失败、C的资源拷贝路径错整个流程就得中断、排查、重来。更糟的是如果某次你忘了先装A直接跑BMaven会安静地报错“Could not find artifact com.example:a:jar:1.0.0-SNAPSHOT”然后你盯着控制台发呆三分钟才反应过来——哦是没装A。这不是低效这是确定性返工。而真正的痛点还不止于此当你把这套操作交给测试同事、交付同事甚至外包团队时“请按A→B→C顺序执行mvn install”这种口头指令在没有明确约束机制的情况下出错率接近30%。我曾在某跨平台系统交付项目中亲眼见过交付文档里只写了“需先构建基础模块”但实际执行时运维同学把C模块的pom.xml里version从1.0.0-SNAPSHOT手误改成了1.0.0结果B模块install时拉不到SNAPSHOT版本整个CI流水线卡在第二步排查了4小时才发现是版本号硬编码问题。所以这个标题里的“多项目按顺序mvn install与package”本质不是教你怎么敲命令而是解决三个真实问题第一执行顺序不可篡改——不能靠人脑记忆必须由脚本强制固化A→B→C的拓扑依赖第二失败即终止——任何一环失败后续步骤绝不执行避免污染本地仓库或生成错误产物第三过程可追溯、结果可验证——每一步的输出日志要保留最终产物jar/war的位置、时间戳、校验和都要有据可查。这已经超出了“自动化”的范畴进入了构建契约Build Contract的层面脚本即协议执行即履约。它不关心你用IntelliJ还是VS Code不关心你本地装的是JDK 8还是17只认准一件事——只要环境满足基本条件Java、Maven、PATH配置正确运行这个bat就必然产出符合预期的制品链。这才是工业级脚本该有的样子而不是网上随手搜到的“for /d %i in (A B C) do cd %i mvn install”那种看似简洁、实则埋雷的玩具代码。提示本文所有脚本均基于Windows平台设计适配Maven 3.6.3与JDK 8环境。Linux/macOS用户可参考文末附录的bash等效实现但核心逻辑依赖拓扑校验、失败熔断、产物归档完全一致绝非简单翻译。2. 脚本骨架设计从“能跑通”到“可交付”的四层结构很多初学者写的bat脚本往往停留在“功能可用”阶段定义几个目录变量用cd /d切换路径挨个执行mvn命令。这种脚本在自己电脑上可能跑得飞起但一旦换台机器、换个JDK版本、甚至只是把项目目录名多加了个空格就会在cd那行直接报错退出连错误原因都看不到。真正可靠的脚本必须像一个小型构建引擎那样分层设计。我把它拆成四个刚性层级每一层都解决一类关键风险2.1 第一层环境守门员Pre-Check Layer这是脚本的第一道防线也是最容易被跳过的环节。它不执行任何构建动作只做三件事验证java -version是否返回有效输出且主版本号≥8验证mvn -v是否能正常打印Maven版本且不低于3.6.3检查所有待构建项目的根目录是否存在且包含pom.xml文件。为什么必须做这些因为Maven的错误提示极其“友好”——当它找不到Java时可能只报The JAVA_HOME environment variable is not defined correctly但不会告诉你JAVA_HOME该指向哪当pom.xml缺失时它会抛出No plugin found for prefix clean这种完全误导的异常。我们的脚本必须在Maven开口前就把环境问题扼杀在摇篮里。echo off setlocal enabledelayedexpansion :: 环境预检 echo [INFO] 正在执行环境预检... set JAVA_VERSION for /f tokens3 %%i in (java -version 2^^1 ^| findstr version) do set JAVA_VERSION%%i if not defined JAVA_VERSION ( echo [ERROR] Java未安装或未配置到PATH请检查JDK安装及JAVA_HOME设置。 exit /b 1 ) set JAVA_MAJOR_VER%JAVA_VERSION:~1,1% if %JAVA_MAJOR_VER% LSS 8 ( echo [ERROR] 当前Java版本为%JAVA_VERSION%要求JDK 8或更高版本。 exit /b 1 ) set MVN_VERSION for /f tokens3 %%i in (mvn -v 2^^1 ^| findstr Apache Maven) do set MVN_VERSION%%i if not defined MVN_VERSION ( echo [ERROR] Maven未安装或未配置到PATH请检查Maven安装及MAVEN_HOME设置。 exit /b 1 ) for /f delims. tokens1,2 %%a in (%MVN_VERSION%) do ( set MVN_MAJOR%%a set MVN_MINOR%%b ) if %MVN_MAJOR% LSS 3 ( echo [ERROR] 当前Maven版本为%MVN_VERSION%要求Maven 3.6.3或更高版本。 exit /b 1 ) if %MVN_MAJOR% EQU 3 if %MVN_MINOR% LSS 6 ( echo [ERROR] 当前Maven版本为%MVN_VERSION%要求Maven 3.6.3或更高版本。 exit /b 1 )这段代码的关键在于它用for /f捕获命令输出并通过字符串截取%JAVA_VERSION:~1,1%提取主版本号避免了正则表达式在bat中的复杂性。更重要的是它把“环境不满足”这个最常见失败原因转化成了清晰、可读、带具体修复指引的错误信息而不是让使用者对着Maven的晦涩报错抓耳挠腮。2.2 第二层项目拓扑解析器Topology Parser“按顺序”不是指你写脚本时手动排A、B、C而是要让脚本能自动识别项目间的依赖关系。理想情况下我们希望脚本读取一个配置文件比如build-order.txt里面按依赖先后顺序列出项目路径./modules/core ./modules/api ./modules/webapp但更进一步我们可以让脚本具备“智能推导”能力扫描每个项目的pom.xml提取dependencies节点下的groupId和artifactId构建一个轻量级的依赖图。不过考虑到bat的文本处理能力有限我们采用折中方案——显式声明 隐式校验。我们在脚本开头定义一个数组式的项目列表并为每个项目指定其“期望依赖项”:: 项目定义区按构建顺序排列 set PROJECTS[0]./modules/core set PROJECTS[1]./modules/api set PROJECTS[2]./modules/webapp :: 依赖声明区格式PROJECTS[N]依赖项1,依赖项2,... set DEPENDS[0] set DEPENDS[1]core set DEPENDS[2]api注意这里DEPENDS[1]core的意思是./modules/api项目在构建前必须确保core模块已成功install到本地仓库。这个core字符串会与./modules/core/pom.xml中的artifactId值进行比对。如果两者不一致脚本会立即报错“项目./modules/api声明依赖core但./modules/core的artifactId为core-lib不匹配请检查pom.xml配置。”这种设计的好处是它把“顺序”从硬编码变成了可配置、可验证的契约。当新同事加入时他不需要背诵A→B→C的顺序只需要看DEPENDS数组就能明白依赖逻辑当项目重构时只要修改DEPENDS声明脚本就会自动拦截不合规的构建请求。2.3 第三层构建执行引擎Execution Engine这一层才是真正的“干活”部分但它绝不是简单循环执行mvn命令。一个健壮的执行引擎必须包含三个子模块2.3.1 命令组装器Command Assembler不同项目可能需要不同的Maven参数。比如core模块只需clean install而webapp模块可能需要clean package -Pprod -DskipTests。我们为每个项目预留参数变量set MVN_ARGS[0]clean install -Dmaven.test.skiptrue set MVN_ARGS[1]clean install -Dmaven.test.skiptrue set MVN_ARGS[2]clean package -Pprod -Dmaven.test.skiptrue执行时脚本会动态拼接cd /d %PROJECTS[2]% mvn %MVN_ARGS[2]%。这样参数管理与项目定义解耦修改某个项目的构建参数无需动其他逻辑。2.3.2 熔断控制器Circuit Breaker这是保障“失败即终止”的核心。bat中实现熔断不能依赖操作符因为它在某些错误码下仍会继续执行而要用errorlevel显式判断cd /d %PROJECT_PATH% echo [INFO] 正在构建项目%PROJECT_NAME% %PROJECT_PATH% echo [INFO] 执行命令mvn %MVN_ARGS% mvn %MVN_ARGS% %LOG_DIR%\%PROJECT_NAME%.log 21 if errorlevel 1 ( echo [ERROR] 项目%PROJECT_NAME%构建失败详细日志见%LOG_DIR%\%PROJECT_NAME%.log echo [FATAL] 构建流程已熔断停止后续所有步骤。 exit /b 1 )关键点在于if errorlevel 1会捕获所有非零退出码包括Maven内部的编译错误、测试失败、插件异常等。并且我们将完整日志重定向到独立文件确保控制台输出干净而原始错误细节全部保留在日志中方便事后审计。2.3.3 产物校验器Artifact Validator构建成功不等于产物正确。mvn install会在%USERPROFILE%\.m2\repository下生成jar包mvn package会在项目target/目录下生成war包。脚本必须验证这些产物是否存在、是否非空:: 验证install产物jar if %MVN_ARGS%clean install -Dmaven.test.skiptrue ( for /f delims %%i in (type %PROJECT_PATH%\pom.xml ^| findstr artifactId) do set ARTIFACT_ID%%i set ARTIFACT_ID!ARTIFACT_ID:*artifactId! set ARTIFACT_ID!ARTIFACT_ID:! set ARTIFACT_ID!ARTIFACT_ID:! set JAR_PATH%USERPROFILE%\.m2\repository\com\example\!ARTIFACT_ID!\1.0.0-SNAPSHOT\!ARTIFACT_ID!-1.0.0-SNAPSHOT.jar if not exist !JAR_PATH! ( echo [ERROR] 预期jar包不存在%JAR_PATH% exit /b 1 ) if !%~zJAR_PATH! EQU 0 ( echo [ERROR] jar包为空文件%JAR_PATH% exit /b 1 ) )这段代码展示了bat中处理XML的“土法炼钢”用findstr提取artifactId行再用多重字符串替换剥离标签。虽然不如XPath优雅但在无外部依赖的前提下它是唯一可行的方案。产物校验是最后一道质量关卡防止出现“控制台显示BUILD SUCCESS但target目录下空空如也”的诡异情况。2.4 第四层交付物归档器Delivery Archiver当所有项目都成功构建后脚本不应就此结束。它应该把最终交付物比如webapp/target/app.war统一拷贝到一个dist/目录下并生成一份build-report.txt记录每个模块的构建时间、Maven版本、产物路径和SHA256校验和[REPORT] 构建完成时间2024-06-15 14:22:33 [MODULE] core-1.0.0-SNAPSHOT.jar | SHA256: a1b2c3... | Path: C:\Users\dev\.m2\repository\...\core-1.0.0-SNAPSHOT.jar [MODULE] api-1.0.0-SNAPSHOT.jar | SHA256: d4e5f6... | Path: C:\Users\dev\.m2\repository\...\api-1.0.0-SNAPSHOT.jar [MODULE] app.war | SHA256: g7h8i9... | Path: D:\project\webapp\target\app.war这份报告是交付给测试团队的“签证”也是上线回滚时的“身份证”。没有它所谓的“构建成功”只是空中楼阁。注意SHA256校验和的计算在Windows原生命令中较难实现我们推荐调用PowerShell命令powershell -Command Get-FileHash %FILE_PATH% -Algorithm SHA256 | ForEach-Object {$_.Hash}。这体现了脚本设计的务实原则——不排斥调用系统自带的高级工具只要它稳定、无需额外安装。3. 实战避坑指南那些让你调试到凌晨三点的bat陷阱写bat脚本最大的幻觉就是觉得它“简单”。事实上bat的语法陷阱之深足以让一个Java老手栽跟头。我在多个项目中踩过的坑总结下来90%都集中在以下五个维度。下面不讲原理只说现象、原因和一招制敌的解决方案。3.1 陷阱一cd /d的路径黑洞现象脚本在cd /d ./modules/core后执行mvn install报错“无法解析依赖”但手动进到该目录执行却一切正常。根因cd /d命令在bat中有一个隐藏行为——当目标路径是相对路径如./modules/core且当前盘符与目标盘符不同时cd /d会静默失败但errorlevel仍为0也就是说脚本以为自己切到了D盘的./modules/core其实还停留在C盘的C:\Users\dev目录下自然找不到pom.xml。破解方案永远用绝对路径定义项目目录并在cd前做盘符校验for /f delims %%i in (%PROJECT_PATH%) do set ABS_PATH%%~fi echo [DEBUG] 将切换至绝对路径%ABS_PATH% cd /d %ABS_PATH% if errorlevel 1 ( echo [ERROR] 切换目录失败%PROJECT_PATH% - %ABS_PATH% exit /b 1 )%%~fi是bat的魔法变量它能把任何路径相对/绝对/带点/带..标准化为完整的绝对路径彻底规避盘符问题。3.2 陷阱二for /f循环的令牌截断灾难现象脚本读取build-order.txt时如果某行包含空格如./modules/my servicefor /f tokens1只会取到./modules/my后面半截丢了。根因for /f默认以空格和Tab为分隔符且tokens只取指定列无法处理含空格的路径。破解方案放弃tokens改用delims空分隔符并配合usebackqfor /f usebackq delims %%i in (build-order.txt) do ( set LINE%%i :: 去除行首尾空格 set LINE!LINE: ! if not defined LINE continue echo [INFO] 发现项目路径%LINE% )delims表示不使用任何分隔符整行作为%%i的值usebackq允许双引号包裹文件名支持路径含空格。这是bat处理文本的黄金组合。3.3 陷阱三setlocal enabledelayedexpansion的延迟生效悖论现象在循环内用set VARvalue赋值紧接着echo %VAR%却输出旧值仿佛赋值没生效。根因bat的变量扩展发生在命令解析阶段而非执行阶段。%VAR%在for循环开始前就被替换成初始值后续set只是改变了内存中的值但echo语句早已“固化”了旧值。破解方案启用延迟扩展并用!VAR!代替%VAR%setlocal enabledelayedexpansion for /l %%i in (0,1,2) do ( set PROJECT!PROJECTS[%%i]! echo [DEBUG] 当前项目!PROJECT! )记住口诀赋值用set读值用!声明用setlocal enabledelayedexpansion。这是bat脚本的“三昧真火”缺一不可。3.4 陷阱四Maven日志重定向的权限静音现象mvn install build.log 21后build.log文件存在但大小为0控制台也无输出。根因某些安全策略或防病毒软件会拦截bat对日志文件的写入导致重定向失败。此时Maven的输出既不进文件也不上控制台彻底消失。破解方案增加重定向失败的兜底检测mvn %MVN_ARGS% %LOG_DIR%\%PROJECT_NAME%.log 21 if not exist %LOG_DIR%\%PROJECT_NAME%.log ( echo [WARN] 日志文件创建失败将输出到控制台... mvn %MVN_ARGS% ) else ( set LOG_SIZE for %%i in (%LOG_DIR%\%PROJECT_NAME%.log) do set LOG_SIZE%%~zi if %LOG_SIZE% EQU 0 ( echo [WARN] 日志文件为空将输出到控制台... mvn %MVN_ARGS% ) )用%%~zi获取文件大小若为0则二次执行确保信息不丢失。这是面向生产环境的必备容错。3.5 陷阱五中文路径与GBK编码的字符坍缩现象项目路径含中文如./模块/core脚本执行cd /d ./模块/core时报错“系统找不到指定的路径”。根因Windows cmd默认使用GBK编码而现代IDE如IntelliJ创建的文件路径常为UTF-8。当bat读取UTF-8编码的路径字符串时GBK解码会将其变成乱码导致cd失败。破解方案在脚本开头强制声明代码页为UTF-8chcp 65001 nulchcp 65001将当前代码页设为UTF-8nul屏蔽掉Active code page: 65001的提示行。这是解决中文路径问题的终极钥匙比任何路径转义都可靠。经验心得我曾在一个金融客户项目中因未加chcp 65001导致脚本在客户提供的“上海研发中心”服务器上始终失败。排查了两天最后发现服务器用户名是中文%USERPROFILE%路径天然含中文而脚本里所有cd都因此失效。加上这一行问题瞬间解决。所以凡是可能接触中文环境的bat脚本第一行必须是chcp 65001这是血泪教训。4. 进阶实战从单机脚本到CI/CD流水线的无缝衔接一个优秀的构建脚本其价值不仅在于本地开发更在于它能成为CI/CD流水线的基石。很多团队的误区是本地用batCI用Jenkins Pipeline两套逻辑并行维护结果经常出现“本地构建成功Jenkins上失败”的尴尬局面。正确的做法是让bat脚本本身就成为CI流水线的“可执行单元”。4.1 Jenkins集成用bat脚本替代Pipeline的shell步骤在Jenkins的Pipeline中你完全可以这样写pipeline { agent any stages { stage(Build Modules) { steps { script { // 在Windows Agent上执行 bat call build-all.bat } } } stage(Deploy to Test) { steps { sh scp dist/app.war usertest-server:/opt/tomcat/webapps/ } } } }关键在于build-all.bat这个脚本。它必须满足两个CI友好原则幂等性多次运行结果一致。为此我们在脚本开头加入清理逻辑:: 清理上一次构建的残留日志和dist目录 if exist %LOG_DIR% rd /s /q %LOG_DIR% if exist dist rd /s /q dist md %LOG_DIR% dist可中断性支持CtrlC安全退出。bat本身不支持信号捕获但我们可以通过timeout命令模拟心跳检测:: 在每个mvn命令前检查是否有中断标志 if exist STOP_BUILD.flag ( echo [INFO] 检测到STOP_BUILD.flag主动退出构建。 exit /b 0 )这样当Jenkins任务被手动中止时它会创建STOP_BUILD.flag文件脚本在下一步执行前检测到便优雅退出避免留下半成品。4.2 Git Hooks自动化提交前强制校验构建顺序我们可以把构建脚本嵌入到Git的pre-commit钩子中实现“提交即构建”的开发体验。在项目根目录的.git/hooks/pre-commit文件中注意这是bash脚本需放在Git Bash环境下#!/bin/bash echo 正在执行预提交构建校验... if command -v powershell.exe /dev/null 21; then # Windows环境调用bat脚本 powershell.exe -Command ./build-all.bat -DryRun else # Linux/Mac环境调用bash脚本 ./build-all.sh --dry-run fi if [ $? -ne 0 ]; then echo 预提交构建校验失败请先修复构建问题。 exit 1 fi这里引入了-DryRun参数让bat脚本只执行环境检查和依赖校验跳过实际的mvn命令。这样开发者在git commit时如果项目顺序或环境有问题会立刻收到反馈而不是等到CI上才暴露。这是一种“左移质量保障”的实践把问题拦截在代码提交的瞬间。4.3 多环境参数化一套脚本三套配置生产环境、测试环境、开发环境往往需要不同的Maven Profile和JVM参数。硬编码在bat里显然不行。我们采用“配置驱动”模式为每个环境准备一个env-prod.conf、env-test.conf文件内容如下# env-prod.conf MVN_PROFILEprod JVM_OPTS-Xmx2g -XX:UseG1GC SKIP_TESTStrue然后在bat脚本中用for /f读取配置:: 加载环境配置 set ENV_CONFIGenv-prod.conf if exist %ENV_CONFIG% ( for /f usebackq eol; tokens1,2 delims %%i in (%ENV_CONFIG%) do ( if %%iMVN_PROFILE set MVN_PROFILE%%j if %%iJVM_OPTS set JVM_OPTS%%j if %%iSKIP_TESTS set SKIP_TESTS%%j ) ) :: 组装Maven参数 set MVN_ARGSclean package -P%MVN_PROFILE% %JVM_OPTS% if %SKIP_TESTS%true set MVN_ARGS%MVN_ARGS% -Dmaven.test.skiptrue这样只需修改ENV_CONFIG变量就能一键切换环境。运维同学发布时根本不用碰bat源码只改配置文件即可大大降低了操作风险。4.4 安全加固敏感信息的零明文存储构建脚本有时需要访问私有Maven仓库这就涉及账号密码。绝不能把这些信息硬编码在bat里我们采用Windows凭据管理器Windows Credential Manager来安全存储:: 从Windows凭据管理器读取Maven仓库密码 for /f delims %%i in (cmdkey /list ^| findstr maven-repo) do ( set CRED_LINE%%i ) if defined CRED_LINE ( for /f tokens2 %%i in (!CRED_LINE!) do ( set REPO_PASSWORD%%i ) )然后在settings.xml中用${env.REPO_PASSWORD}引用。这样密码只存在于Windows系统的加密凭据库中脚本里只有变量名即使代码泄露密码依然安全。这是企业级脚本必须具备的安全底线。最后分享一个真实技巧在大型项目中我习惯在脚本末尾添加一个pause命令但仅在DEBUG模式下生效。方法是在脚本开头加一句if not defined DEBUG set DEBUGfalse然后在结尾if %DEBUG%true ( echo [DEBUG] 构建流程结束按任意键退出... pause )这样日常运行时DEBUG未定义脚本静默退出调试时只需set DEBUGtrue build-all.bat就能看到每一步的详细输出极大提升排错效率。这个小开关是我十年运维生涯中最常用的“万能调试器”。5. 全平台兼容方案当你的团队既有Windows也有Mac/Linux现实世界中不可能所有开发者都用Windows。一个成熟的构建体系必须跨越操作系统壁垒。我们的策略是核心逻辑统一执行层适配。即bat脚本和bash脚本共享同一套项目定义、依赖声明和参数配置只是外壳不同。5.1 配置文件标准化build-config.json摒弃纯文本的build-order.txt改用JSON格式的build-config.json{ projects: [ { path: ./modules/core, name: core, mavenArgs: [clean, install, -Dmaven.test.skiptrue], dependsOn: [] }, { path: ./modules/api, name: api, mavenArgs: [clean, install, -Dmaven.test.skiptrue], dependsOn: [core] } ], environments: { prod: { mavenProfile: prod, jvmOpts: -Xmx2g } } }这个JSON文件是平台无关的“构建契约”bat和bash脚本都读取它保证逻辑一致性。5.2 Windows端bat PowerShell混合编程bat负责流程控制PowerShell负责复杂文本处理。例如解析JSON:: 用PowerShell解析JSON提取项目列表 for /f delims %%i in (powershell -Command { $cfg Get-Content build-config.json | ConvertFrom-Json; $cfg.projects | ForEach-Object { $_.path } }) do ( echo [INFO] 发现项目%%i )PowerShell的ConvertFrom-Json完美解决了bat原生无法解析JSON的短板且PowerShell在Windows 7 SP1上原生内置无需额外安装。5.3 macOS/Linux端bash jq工具链在Unix系系统上我们用jq这个轻量级JSON处理器#!/bin/bash # build-all.sh if ! command -v jq /dev/null; then echo Error: jq is not installed. Please run: brew install jq (macOS) or apt-get install jq (Ubuntu). exit 1 fi PROJECTS$(jq -r .projects[].path build-config.json) while IFS read -r project_path; do if [[ -n $project_path ]]; then echo [INFO] Building project: $project_path cd $project_path || exit 1 mvn $(jq -r .projects[] | select(.path \$project_path\) | .mavenArgs[] build-config.json | xargs) || exit 1 fi done $PROJECTSjq是Unix世界的JSON瑞士军刀它的表达能力远超bat的文本处理。通过jq -r提取路径再用select()精准匹配参数实现了与Windows端完全对等的功能。5.4 统一入口build.sh的跨平台调度器为了让开发者无论在哪种系统上都只需执行同一个命令我们创建一个build.sh#!/bin/bash # build.sh - 跨平台统一入口 if [[ $OSTYPE msys ]] || [[ $OSTYPE cygwin ]]; then # Git Bash on Windows ./build-all.bat elif [[ $OSTYPE darwin* ]]; then # macOS ./build-all.sh elif [[ $OSTYPE linux-gnu* ]]; then # Linux ./build-all.sh else echo Unsupported OS: $OSTYPE exit 1 fi开发者只需chmod x build.sh ./build.sh脚本会自动识别环境并调用对应后端。这就是“一次编写处处运行”的朴素哲学。我在某跨国协作项目中团队成员分布在东京、柏林、旧金山三地开发机涵盖Windows、macOS、Ubuntu。最初大家各自维护一套脚本两周后就出现了“东京同事的bat能跑柏林同事的bash报错”的混乱局面。后来我们推行了这套JSON配置双端脚本的方案一周内所有构建问题归零。事实证明跨平台不是技术难题而是规范难题。只要定义好“契约”实现只是体力活。6. 附录完整可运行脚本与快速上手指南以下是经过千锤百炼、已在多个生产环境验证的build-all.bat完整代码。它集成了前述所有最佳实践环境预检、依赖拓扑、熔断执行、产物校验、日志归档。你可以直接复制保存为build-all.bat放入你的项目根目录开箱即用。echo off chcp 65001 nul setlocal enabledelayedexpansion :: 配置区 set LOG_DIRlogs set DIST_DIRdist set CONFIG_FILEbuild-config.json :: 项目定义按构建顺序 set PROJECTS[0]./modules/core set PROJECTS[1]./modules/api set PROJECTS[2]./modules/webapp :: 依赖声明PROJECTS[N]依赖的artifactId set DEPENDS[0] set DEPENDS[1]core set DEPENDS[2]api :: Maven参数按项目索引 set MVN_ARGS[0]clean install -Dmaven.test.skiptrue set MVN_ARGS[1]clean install -Dmaven.test.skiptrue set MVN_ARGS[2]clean package -Pprod -Dmaven.test.skiptrue :: 环境预检 echo [INFO] 开始执行构建预检... if not exist %LOG_DIR% md %LOG_DIR% if not exist %DIST_DIR% md %DIST_DIR% :: 检查Java set JAVA_VERSION for /f tokens3 %%i in (java -version 2^^1 ^| findstr version) do set JAVA_VERSION%%i if not defined JAVA_VERSION ( echo [ERROR] Java未安装或PATH未配置。 exit /b 1 ) set JAVA_MAJOR%JAVA_VERSION:~1,1% if %JAVA_MAJOR% LSS 8 ( echo [ERROR] Java版本过低要求JDK 8。 exit /b 1 ) :: 检查Maven set MVN_VERSION for /f tokens3 %%i in (mvn -v 2^^1 ^| findstr Apache Maven) do set MVN_VERSION%%i if not defined MVN_VERSION ( echo [ERROR] Maven未安装或PATH未配置。 exit /b 1 ) :: 检查项目目录 set PROJECT_COUNT0 for /L %%i in (0,1,2) do ( if defined PROJECTS[%%i] ( for /f delims %%p in (!PROJECTS[%%i]!) do ( set ABS_PATH
阅读完成 · 觉得有帮助?
咨询建站