相见恨晚的Java部署插件 wagon-maven-plugin

背景

maven 有一个wagon-plugin 插件,可以实现项目的自动部署,提高开发人员的发布、测试效率。对基于 maven 的 Java 项目配置上自动部署插件,既简单又方便。

这个轻量级的插件,底层使用的是 ssh 的命令 scp ,完成部署包的上传及目标脚本的执行。项目开发初期或集成测试期用这个插件,很方便,极力推荐使用 maven 开发的 Java 项目都配置上这个插件。

记录 maven 的 wagon-plugin 自动部署插件的两个问题点:

  1. 远程主机密码中有特殊字符 @ 直接在 url 路径的 scp 命令中写帐号密码识别不了的问题。
  2. 执行 Java 命令报 java: command not found 的问题。
  3. commands 命令集合中,多个 command 之间开启的是不同的会话,如果相互依赖的 Shell 命令只能放在同一个 command 标签中,命令之间用 ; 分割。

实践流程

wagon-maven-plugin 实现远程自动化知识回顾:

第一步 ,引入插件依赖,在 build 节点中配置 extensions 额外依赖:

typescript 复制代码
<extensions>
   <!--自动部署插件 wagon-ssh 依赖配置 -->
   <extension>
       <groupId>org.apache.maven.wagon</groupId>
       <artifactId>wagon-ssh</artifactId>
       <version>2.8</version>
   </extension>
</extensions>

第二步,配置 maven server 主机信息,在 maven 的 setting.xml 配置文件的 servers 节点中,添加一个目标主机的配置信息,配置主机的帐号和密码。

typescript 复制代码
<server>
    <id>linux-server1</id>
    <username>root</username>
    <password><![CDATA[xxxxx特殊字符]]></password>
</server>

第三步 ,wagon 插件配置,指定 fromFile、url 、commands :

typescript 复制代码
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>wagon-maven-plugin</artifactId>
    <version>2.0.2</version>
    <configuration>
        <serverId>linux-server1</serverId>
        <fromFile>target/xxx.jar</fromFile>
        <!-- scp:// IP 这里必须是双斜杠-->
        <url>scp://IP/path/lib</url>
        <!-- 在服务器执行的命令集合 -->
        <commands>
          <!-- 1、所有需要执行的命令,必须放在一个 command 中,不同 command 属于不同的 ssh session 了 -->
          <!-- 2、远程执行shell脚本时,不会自动加载环境变量,会报java: command not found,所以需要执行一次环境变量加载-->
          <command><![CDATA[cd ${path}/bin; pwd; sh ./stop.sh; source /etc/profile; sh ./start.sh]]></command>
        </commands>
        <!-- 显示运行命令的输出结果 -->
  <displayCommandOutputs>true</displayCommandOutputs>
    </configuration>
</plugin>

第四步,执行插件命令:

typescript 复制代码
mvn wagon:upload-single wagon:sshexec -X

实践启示录

在父工程的 build 节点中统一配置 wagon 插件信息,使用 artifictId 属性针对各个子模块打包部署,很方便。

typescript 复制代码
<fromFile>target/${artifactId}-${version}.jar</fromFile>
<url>scp://${serverIp}${path}/${artifactId}/lib</url>

自模块和父模块的 build 插件配置的 commands 之间的关系:

1、子模块定义了自己的 commands 集合,那么以子模块为主。 2、自模块没有定义自己的 commands 集合,那么会继承父模块的命令集合。

如果自模块有特殊的命令,或者就是不需要命令,那么可以简单给个命令 例如 pwd ,防止被父模块的命令替代了。

这个轻量级的 maven 插件,一个命令就能搞定最新代码的自动发布,直接将运维发布工作从 10 分钟缩短到 1 分钟。想到以前大量的手动 scp 上传部署包、手动重启的工作,就有相见恨晚的感觉。

自从知道这个插件后,我对我参与的 Java 项目都加上了这个插件,不知道别人用不用,我自己用命令确实很方便。再配置 Jenkins 的定时自动发布,Java 应用环境更新就更容易了!

参考

  1. 《远程 Shell 执行 Java 命令,环境变量问题》
  2. 《主机密码有特殊字符,wagon-plugin 插件的用法》
  3. 《wagon-maven-plugin 基本用法》
相关推荐
記億揺晃着的那天9 小时前
Amazon Ads API 自建 SDK 架构升级实战:从手工生成 JAR 到可追溯构建体系
maven·架构设计·sdk开发·openapi·amazon ads api
小白的码BUG之路16 小时前
Jenkins -- 配置jdk和maven
java·jenkins·maven
砚底藏山河18 小时前
数据新鲜度 SLA 监控
java·大数据·python·maven
开开心心就好2 天前
手机电池健康怎么查?看容量温度循环次数
spring·智能手机·ffmpeg·计算机外设·电脑·maven·音视频
知守观2 天前
mirrorOf= 把私服请求拦去了公网镜像:本地能跑,CI 上内部包 404 排查
后端·ci/cd·maven
不老刘2 天前
Maven 多医院分支场景下 groupId 的设计与 Jenkins 落地实践
servlet·jenkins·maven
毕业设计7032 天前
(免费领源码)基于node的学生公寓管理系统06412- java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
vue.js·mysql·node.js·maven·mybatis·express·b/s
知守观3 天前
同事的 SNAPSHOT 更新了,我三天后才拉到:Maven 更新检查被 _remote.repositories 静默跳过
java·后端·maven
知守观3 天前
Maven SNAPSHOT 更新排查:-U 无效、clean 无用,问题在 _remote.repositories(附完整链路)
java·后端·maven
知守观4 天前
多模块工程没 install,跑起来的代码是上周的:Maven reactor 依赖解析踩坑
java·maven·intellij idea