rsync更适合java应用在linux测试或预发环境部署,因其支持增量同步、路径过滤、权限与目录结构保留;scp仅适用于单次、小文件、快速验证等全量传输场景。

Java 应用在 Linux 测试或预发环境部署时,核心诉求是:只传变更内容、不覆盖无关文件、不暴露密码、保持目录结构和权限。rsync 比 scp 更适合这个场景——它天然支持增量同步、路径过滤、属性保留;scp 则适合单次、小文件、快速验证类操作。
优先用 rsync 实现增量发布
Java 部署通常只需更新 jar 包 + 对应 profile + 静态资源(如 webapp/),rsync 的 -a(归档) 和 --delete 组合能精准控制:
-
源路径末尾加 / 表示同步内容:例如
src/main/webapp/→ 目标目录下直接铺开 HTML/JS/CSS,不带 webapp 子目录 -
不加 / 表示连目录名一起传:例如
src/main/webapp→ 目标会多一层 webapp/ 目录,多数 Java 项目不需要 -
排除日志和临时文件:加
--exclude='*.log' --exclude='tmp/',避免把本地调试日志误推上去 -
用 sshpass 管理密码(测试环境可用):写密码到
~/.env1_pass(权限 600),命令中引用即可,不暴露明文
示例(推送到 test-env1):
sshpass -f ~/.env1_pass rsync -avz --delete \
--exclude='*.log' --exclude='tmp/' \
target/myapp.jar \
src/main/resources/application-test1.yml \
user@192.168.10.11:/opt/app/test-env1/
scp 适用的边界场景
scp 不做差异比对,每次全量传输,但胜在简单、无需额外工具、适合一次性操作:
- 首次部署空目录,或确认目标完全清空后重传
- 只传一个 jar 或一个配置文件,且网络延迟低、文件小(
- 调试阶段快速替换某文件,不想写 rsync 命令参数
注意:scp 默认不递归复制目录,必须加 -r;也不保留软链接和时间戳,Java 应用若依赖这些属性,建议改用 rsync。
安全与权限关键点
Java 应用部署目录(如 /opt/app/test-env1/)通常由非 root 用户(如 appuser)运行,同步时要确保:
- 目标路径属主为 appuser,且 rsync 使用该用户 SSH 登录(如
appuser@192.168.10.11) - jar 包需可执行(
chmod +x)或至少可读可执行(644或755,依启动方式而定) - 配置文件(yml/properties)权限设为
600,防止敏感信息泄露 - 禁用密码明文出现在命令行:不用
sshpass -p 'xxx',改用密码文件或 SSH 密钥
避免常见翻车操作
几个高频出错点:
- 忘记 --delete 导致旧配置残留:比如 application-prod.yml 还在,新推的 application-test1.yml 生效不了
-
webapp/ 少打斜杠,导致静态资源嵌套多一层:访问
/static/js/app.js404,实际路径变成/webapp/static/js/app.js -
用 root 推送,但应用以 appuser 启动 → 权限拒绝读 jar:推送后记得
chown -R appuser:appuser /opt/app/test-env1 -
本地打包未 clean,target/ 下混着旧版 jar:同步前先
mvn clean package -DskipTests
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











