通常情况下,程序开发完成后部署到线上Linux服务器,可能需要经历打包、将包文件传到服务器、SSH连上服务器、敲命令启动程序等一系列繁琐的步骤。

实际上这些步骤都可以通过Maven的一个插件wagon-maven-plugin来自动完成。

1.配置Linux服务器用户名和密码

为了让wagon-maven-plugin插件能SSH连上Linux服务器,首先需要在Maven的配置文件settings.xml中配置好server的用户名和密码。

1
2
3
4
5
6
7
<servers>
<server>
<id>mylinuxserver</id>
<username>MELON</username>
<password>123456</password>
</server>
</servers>

2.文件上传到服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<build>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ssh</artifactId>
<version>2.8</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>wagon-maven-plugin</artifactId>
<version>1.0</version>
<configuration>
<serverId>mylinuxserver</serverId>
<fromFile>target/test.jar</fromFile>
<url>scp://192.168.20.128/home/xxg/Desktop</url>
</configuration>
</plugin>
</plugins>
</build>

<serverId>mylinuxserver</serverId>即上一步中在settings.xml中配置的service的id,
<fromFile>target/test.jar</fromFile>是要上传到服务器的文件,一般来说是jar或者war包,
<url>scp://192.168.20.128/home/xxg/Desktop</url>配置服务器的地址以及文件上传的目录。

配置完成后,运行命令: mvn clean package wagon:upload-single

package、wagon:upload-single分别对项目进行打包和上传操作。命令运行结束后,文件就会成功上传到Linux服务器。

3.在服务器上执行Linux命令

部署项目不仅要把包传上服务器,而且还需要执行一些指令来启动程序。在程序启动之前,可能还需要将原来的程序关闭。

3.1 运行jar文件

启动jar包通常会使用java -jar test.jar命令,可以将命令配置在pom.xml中:

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
<build>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ssh</artifactId>
<version>2.8</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>wagon-maven-plugin</artifactId>
<version>1.0</version>
<configuration>
<serverId>mylinuxserver</serverId>
<fromFile>target/test.jar</fromFile>
<url>scp://192.168.20.128/home/xxg/Desktop</url>
<commands>
<!-- 杀死原来的进程 -->
<command>pkill -f test.jar</command>
<!-- 重新启动test.jar,程序的输出结果写到nohup.out文件中 -->
<command>nohup java -jar /home/xxg/Desktop/test.jar > /home/xxg/Desktop/nohup.out 2>&amp;1 &amp;</command>
</commands>
<!-- 显示运行命令的输出结果 -->
<displayCommandOutputs>true</displayCommandOutputs>
</configuration>
</plugin>
</plugins>
</build>

配置完成后,运行命令: mvn clean package wagon:upload-single wagon:sshexec

package、wagon:upload-single、wagon:sshexec分别对项目进行打包、上传、运行command命令的操作。命令运行结束后,在服务器上查看进程ps -ef|grep test.jar,或者查看nohup.out文件,就可以看到Java程序在服务器上已经启动。

3.2 上传war包并启动Tomcat

如果是Web应用,可使用服务器上的Tomcat来部署。

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
<build>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ssh</artifactId>
<version>2.8</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>wagon-maven-plugin</artifactId>
<version>1.0</version>
<configuration>
<serverId>mylinuxserver</serverId>
<fromFile>target/javawebdeploy.war</fromFile>
<!-- 上传到Tomcat的webapps目录下 -->
<url>scp://192.168.20.128/coder/tomcat/apache-tomcat-7.0.55/webapps</url>
<commands>
<!-- 重启Tomcat -->
<command>sh /coder/tomcat/apache-tomcat-7.0.55/bin/shutdown.sh</command>
<command>rm -rf /coder/tomcat/apache-tomcat-7.0.55/webapps/javawebdeploy</command>
<command>sh /coder/tomcat/apache-tomcat-7.0.55/bin/startup.sh</command>
</commands>
<displayCommandOutputs>true</displayCommandOutputs>
</configuration>
</plugin>
</plugins>
</build>

完成以上配置后,同样可通过mvn clean package wagon:upload-single wagon:sshexec命令自动部署。

3.3 配置execution

如果你觉得mvn clean package wagon:upload-single wagon:sshexec命令太长了不好记,那么可以配置execution,在运行package打包的同时运行upload-single和sshexec。

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
35
36
37
38
<build>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ssh</artifactId>
<version>2.8</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>wagon-maven-plugin</artifactId>
<version>1.0</version>
<executions>
<execution>
<id>upload-deploy</id>
<!-- 运行package打包的同时运行upload-single和sshexec -->
<phase>package</phase>
<goals>
<goal>upload-single</goal>
<goal>sshexec</goal>
</goals>
<configuration>
<serverId>mylinuxserver</serverId>
<fromFile>target/javawebdeploy.war</fromFile>
<url>scp://192.168.20.128/coder/tomcat/apache-tomcat-7.0.55/webapps</url>
<commands>
<command>sh /coder/tomcat/apache-tomcat-7.0.55/bin/shutdown.sh</command>
<command>rm -rf /coder/tomcat/apache-tomcat-7.0.55/webapps/javawebdeploy</command>
<command>sh /coder/tomcat/apache-tomcat-7.0.55/bin/startup.sh</command>
</commands>
<displayCommandOutputs>true</displayCommandOutputs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

配置完成后,即可使用mvn clean package来代替mvn clean package wagon:upload-single wagon:sshexec

备注: 如果遇到项目中需要加入特有的一些jar包到lib下,那么需要在maven-compiler-plugin的configuration标签下设置

1
2
3
<compilerArguments>
<extdirs>/Users/Melon/Documents/workspace/api.handspaper.com/WebContent/WEB-INF/lib</extdirs>
</compilerArguments>