使用Rsync在服务器上运行Java代码

服务器上运行

在Windows环境同步到Linux环境中不能运行

IDEA自带的SSH+Rsync有BUG,不能使用,这里使用脚本来实现。

准备知识

编译

1
mvn compile

同步代码

1
rsync -avzP --password-file=/cygdrive/d/auth.txt ./target/classes/ zj@192.168.7.101::zjhome

生成jar

1
mvn dependency:copy-dependencies -DincludeScope=compile

说明:
默认会将jar包放在项目中的target下的dependency目录下面

同步Jar

1
rsync -avzP --password-file=/cygdrive/d/auth.txt ./target/dependency/ zj@192.168.7.101::zjhome

运行

服务器上在同步的文件夹内

1
java -cp a.jar:b.jar cn.psvmc.WordCount

或者本地运行

1
ssh root@192.168.7.101 "cd /root/zjhome/&&java -cp a.jar:b.jar cn.psvmc.WordCount"

注意

所有jar包之间要拼接,不能使用通配符*

生成Jar

先运行以下命令生成jar

1
mvn dependency:copy-dependencies -DexcludeScope=provided

同步Jar

1
rsync -avzP --password-file=/cygdrive/d/auth.txt ./target/dependency/ zj@192.168.7.101::zjhome

添加免密登录

Windows中运行

1
2
cd C:\Windows\System32\OpenSSH
.\ssh-keygen -t rsa

把本地用户目录.ssh下的id_rsa.pub中的内容追加到服务器用户目录.ssh下的authorized_keys的内容后面。

比如我本地路径为

1
C:\Users\Administrator\.ssh

脚本

把脚本文件放到项目的根目录

syncrun.bat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@echo off
chcp 65001
rem 编译Jar并上传
call mvn clean
call mvn dependency:copy-dependencies -DincludeScope=compile
rsync -avz --password-file=/cygdrive/d/auth.txt ./target/dependency/ zj@192.168.7.101::zjhome

rem 拼接Jar地址
setlocal enabledelayedexpansion
set MYPATH=%cd%\target\dependency\
set pathAll=.
for /f "delims=" %%a in ('dir /b %MYPATH%\') do (
set pathAll=!pathAll!:%%a
)

rem 代码编译并上传
call mvn compile
rsync -avz --password-file=/cygdrive/d/auth.txt ./target/classes/ zj@192.168.7.101::zjhome

rem 执行代码
echo 'export LANG=zh_CN.utf8 && cd /root/zjhome/&&java -cp %pathAll% com.xhkjedu.TCS -job /root/zjhome/task_trans.json'>job.txt
ssh root@192.168.7.101 "export LANG=zh_CN.utf8 && cd /root/zjhome/&&java -cp %pathAll% com.xhkjedu.TCS -job /root/zjhome/task_mysql2hive2.json"

本地添加运行脚本选择上面的脚本文件

image-20221125202607948

服务器上运行(新)

上面的方式出现一个问题,当我们的命令特别长的时候,会超出命令的长度,从而导致无法执行。

解决方式

本地把服务器上要执行的脚本拼接保存在文件中,上传文件后在服务器上执行。

代码示例

运行不更新Jar

syncRunNoJar.bat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@echo off
chcp 65001

set serverIp=192.168.7.101
rem set serverIp=36.137.162.62

rem 代码编译并上传
call mvn compile
rsync -avz --password-file=/cygdrive/d/auth.txt ./target/classes/ zj@%serverIp%::zjhome

rem 把所有命令写入到本地文件中
set filename=z_server_run.sh
setlocal enabledelayedexpansion
set MYPATH=%cd%\target\dependency\
echo #!/bin/sh >%filename%
echo echo JAVA_HOME:$JAVA_HOME >>%filename%
<nul set /p ="cd /root/zjhome/&&java -Dsun.security.krb5.debug=true -Djava.security.auth.login.config=/data/hadoop/etc/hadoop/hdfs.conf -Djava.security.krb5.conf=/etc/krb5.conf -cp ">>%filename%
<nul set /p =".">>%filename%
for /f "delims=" %%a in ('dir /b %MYPATH%\') do (
<nul set /p =":%%a">>%filename%
)

rem echo com.xhkjedu.TCS -job /root/zjhome/task_extract_mysql2hive.json >>%filename%
rem echo com.xhkjedu.TCS -job /root/zjhome/task_service.json >>%filename%
echo com.xhkjedu.TCS -job /root/zjhome/test.json >>%filename%
rem echo com.xhkjedu.test.KerberosTest >>%filename%
rem echo com.xhkjedu.test.TableApiExample >>%filename%


rem 上传执行命令脚本
rsync -avz --password-file=/cygdrive/d/auth.txt ./%filename% zj@%serverIp%::zjhome

rem 运行
ssh root@%serverIp% "export LANG=zh_CN.utf8 && cd /root/zjhome/&&sh %filename%"

另外jar包是不经常变化的,所以把同步Jar也单独提出来了。

只更新Jar

syncJar.bat

1
2
3
4
5
6
7
8
9
@echo off
chcp 65001
rem 编译Jar并上传
set serverIp=192.168.7.101
rem set serverIp=36.137.162.62
call mvn clean
call mvn dependency:copy-dependencies -q -DincludeScope=compile

rsync -auz --password-file=/cygdrive/d/auth.txt ./target/dependency/ zj@%serverIp%::zjhome

Rsync参数

rsync是一款常用的文件传输工具,它可以通过本地或远程连接,实现文件同步和备份。

以下是一些常见的rsync参数说明:

  • -a:归档模式,表示以递归方式传输文件,并保持文件的属性(包括权限,时间戳等)。
  • -v:详细输出,显示传输的文件列表和详细过程。
  • -r:递归复制目录及其内容。
  • -z:压缩传输,使用压缩算法减少传输的数据量。
  • -P:显示传输进度,同时允许断点续传。
  • -u:仅传输源文件中新于目标文件的文件。
  • --delete:删除目标目录中源目录没有的文件。
  • --exclude:排除指定的文件或目录。
  • --include:仅传输指定的文件或目录。

这些参数可以根据具体需求进行组合使用,以实现所需的文件传输操作。

请注意,rsync的参数还有很多其他选项,可以通过运行rsync --help命令查看完整的参数列表。