maven插件wagon-ssh、os-maven-plugin、buildnumber-maven-plugin使用详解

文章目录

  • 前言
  • 一、os-maven-plugin的使用
  • 二、buildnumber-maven-plugin使用
    • 1、时间戳策略
    • 2、数字策略
  • 三、wagon-ssh使用
    • 1、上传文件/文件夹
    • 2、执行Linux命令或者shell脚本
  • 总结


前言

有时我们在构建项目时,希望能自动生成版本号或者生成不同操作系统标识的版本后缀,这时我们可以通过os-maven-plugin、buildnumber-maven-plugin这两个插件来完成。
如果我们想在构建完成后再进行上传操作,比如将打包后的文件上传到固定的发布目录,或者直接进行自动更新操作,这时我们可以使用wagon-ssh插件来完成这样的功能。


一、os-maven-plugin的使用

严格来说os-maven-plugin算不上一个插件,它只是一个编一阶段的依赖库,他的主要作用是提供本机的操作系统信息,方便我们在编译代码时引用相关的属性。
具体使用如下:

<build>
  <extensions>
    <extension>
      <groupId>kr.motd.maven</groupId>
      <artifactId>os-maven-plugin</artifactId>
      <version>1.7.0</version>
    </extension>
  </extensions>
</build>

然后我们就可以在pom.xml中来使用它提供的一些系统属性,目前主要提供了下面这些属性:

PropertyDescriptionvalue
os.detected.name操作系统名称linux/windows/osx等
os.detected.arch操作系统架构x86_32/x86_64/arm_32/aarch_64等
os.detected.bitness操作系统位数32/64
os.detected.version.*操作系统版本相关
os.detected.classifier操作系统名称和架构${os.detected.name}-${os.detected.arch}

下面我们使用maven-antrun-plugin插件来打印相关信息,添加如下配置:

<plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <phase>test</phase>
            <configuration>
                <target>
                    <echo message="os.detected.name: ${os.detected.name}"/>
                    <echo message="os.detected.arch: ${os.detected.arch}"/>
                    <echo message="os.detected.bitness: ${os.detected.bitness}"/>
                    <echo message="os.detected.version: ${os.detected.version}"/>
                    <echo message="os.detected.version.major: ${os.detected.version.major}"/>
                    <echo message="os.detected.version.minor: ${os.detected.version.minor}"/>
                    <echo message="os.detected.classifier: ${os.detected.classifier}"/>
                </target>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin>

然后运行maven命令:

mvn clean -DskipTests compile

输出结果:

[INFO] os.detected.name: osx
[INFO] os.detected.arch: x86_64
[INFO] os.detected.bitness: 64
[INFO] os.detected.version: 10.16
[INFO] os.detected.version.major: 10
[INFO] os.detected.version.minor: 16
[INFO] os.detected.classifier: osx-x86_64

另外在maven的dependency标签中有一个classifier属性,这个属性其实就是上面提供的os.detected.classifier,表示当前依赖的库是某个特定操作系统下的库。
比如:

<project>
  <dependencies>
    <dependency>
      <groupId>com.example</groupId>
      <artifactId>my-native-library</artifactId>
      <version>1.0.0</version>
      <classifier>${os.detected.classifier}</classifier>
    </dependency>
  </dependencies>
</project>

这样会根据你当前的操作系统的classifier去加载对应的库。

如果我们要发布特定操作系统下的一个依赖库,我们可以配合maven-jar-plugin插件来使用,添加如下配置:

<plugin>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <classifier>${os.detected.classifier}</classifier>
    </configuration>
</plugin>

运行打包命令:

mvn clean -DskipTests package

打包成功后,生成的jar文件会自动加上os.detected.classifier的值,如下所示:

二、buildnumber-maven-plugin使用

默认情况下,当我们不去修改build.finalName的值时。maven打包会自动带上项目的名称和version属性,如果我们想要对项目进行版本管理,这样每次打包就需要手动去修改版本号。buildnumber-maven-plugin能帮我们实现自动添加版本号的功能,但总的来说如果想要高度定制自己的版本号策略,这个插件还是不太能满足,下面我们来看下buildnumber-maven-plugin提供了哪些版本号策略。

取名叫buildnumber-maven-plugin的插件有很多,而且资料很乱,下面我们使用org.codehaus.mojo。还有其他的groupId,大家可以自行去研究。
使用配置:

<build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>buildnumber-maven-plugin</artifactId>
      <version>3.1.0</version>
      <executions>
        <execution>
          <phase>validate</phase>
          <goals>
            <goal>create</goal>
          </goals>
        </execution>
      </executions>
      <configuration>
        <doCheck>true</doCheck>
        <doUpdate>true</doUpdate>
      </configuration>
    </plugin>
  </plugins>
</build>

我们通过案例来介绍他的版本号策略。

1、时间戳策略

插件会提供一个buildNumber的全局属性,我们可以直接在pom.xml中使用。
时间戳就是根据当前的时间来生成版本号。

配置如下:

<build>
    <finalName>pkg-sb-${timestamp}</finalName>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>buildnumber-maven-plugin</artifactId>
            <version>1.4</version>
            <configuration>
                <timestampFormat>yyyyMMddHHmmss</timestampFormat>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>create-timestamp</goal>
                    </goals>
                </execution>
            </executions>
            <inherited>false</inherited>
        </plugin>

    </plugins>
</build>

这样我们会生成pkg-sb-20240223104052.jar这样的文件,在timestampFormat中,可以根据自身情况来进行格式化。

另外这种方式,使用maven自带的全局时间变量也可以完成。

添加全局时间变量:

<properties>
	<maven.build.timestamp.format>yyyy-MM-dd HH:mm:ss</maven.build.timestamp.format>
</properties>

然后修改build.finalName:

<build>
    <finalName>pkg-sb-${maven.build.timestamp}</finalName>
</build>

这样就会生成pkg-sb-2024-02-23 02:44:43.jar文件。

2、数字策略

注意:要使用这种模式需要你的项目是在scm模式下才行,就是项目需要在subversion, git, mercurial, perforce(using p4maven)仓库中才行。而且需要在pom.xml配置scm标签。

如下所示在pom.xml中添加:

<scm>
    <connection>scm:git:https://github.com/xxx.git</connection>
    <developerConnection>scm:git:https://github.com/xxx.git</developerConnection>
    <tag>HEAD</tag>
    <url>https://github.com/xxx.git</url>
</scm>

上面的xxx替换成你实际的项目,当然出了github,还可以是任意的支持git仓库的私有库或者其他平台。
然后添加插件配置:

<build>
    <finalName>pkg-sb-${buildNumber}</finalName>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>buildnumber-maven-plugin</artifactId>
            <version>3.1.0</version>
            <executions>
                <execution>
                    <id>generate-buildnumber</id>
                    <phase>validate</phase>
                    <goals>
                        <goal>create</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <format>1.0.{0,number}</format> 
                <items>
                    <item>buildNumber</item> 
                </items>
                <doCheck>false</doCheck>
                <doUpdate>false</doUpdate>
            </configuration>
        </plugin>

    </plugins>
</build>

然后运行打包命令:

mvn clean -DskipTests package
  1. 第一次打包生成文件:pkg-sb-1.0.1.jar
  2. 第二次打包生成文件:pkg-sb-1.0.2.jar
    同时在项目目录下,还生成了一个buildNumber.properties的文件,内容如下:
#maven.buildNumber.plugin properties file
#Fri Feb 23 11:23:27 CST 2024
buildNumber=2

也就是说,每次打包,这个文件都会更新

format标签可以进行任意的字符串格式化操作,比如下面的这段配置:

<configuration>
    <format>At {1,time} on {1,date}, there was {2} on planet {0,number,integer}.</format>
    <items>
        <item implementation="java.lang.Integer">7</item>
        <item>timestamp</item>
        <item>a disturbance in the Force</item>
    </items>
</configuration>

生成的最终文件格式为:
pkg-sb-At 11:29:09 on 2024-2-23, there was a disturbance in the Force on planet 7…jar

三、wagon-ssh使用

打包后,如果我们要把相应的文件上传到服务器,或者直接进行自动更新操作,那么我们可以使用wagon-ssh来完成。
wagon-ssh的功能很强大,能进行File、HTTP、HTTP lightweight、FTP、SSH/SCP、WebDAV、SCM (in progress)操作,下面我们主要介绍SSH/SCP的相关操作。其他使用方式大家可以参照官网
在maven中使用wagon-ssh配置如下:

<project>
  [...]
  <build>
    [...]
    <extensions>
      <extension>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-ssh</artifactId>
        <version>${wagonApiVersion}</version>
      </extension>
    </extensions>

    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>wagon-maven-plugin</artifactId>
        <version>2.0.2</version>
        <executions>
          <execution>
            <id>upload-javadoc</id>
            <phase>deploy</phase>
            <goals>
              <goal>upload</goal>
            </goals>
            <configuration>
              <fromDir>local.dir</fromDir>
              <includes>*</includes>
              <excludes>pom.xml</excludes>
              <url>scp://your.remote.host/</url>
              <toDir>remote.dir</toDir>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

下面我们通过实际的使用实例来介绍。

1、上传文件/文件夹

<build>
    <finalName>pkg-sb</finalName>
    <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>2.0.2</version>
            <executions>
                <execution>
                    <id>upload-javadoc</id>
                    <phase>package</phase>
                    <goals>
                        <goal>upload</goal>
                    </goals>
                    <configuration>
                        <includes>*</includes>
                        <excludes>pom.xml</excludes>
                        <fromDir>conf</fromDir>
                        <url>scp://root:tomcat@192.168.101.170</url>
                        <toDir>/root/test</toDir>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

上面的配置我们将项目下的conf文件夹下面的文件上传到了192.168.101.170的/root/test目录下。这里可以通过includes和excludes来进行文件过滤操作。

2、执行Linux命令或者shell脚本

如果我们要进行操作,可以添加如下配置:

 <build>
    <finalName>pkg-sb</finalName>
    <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>2.0.2</version>
            <executions>
                <execution>
                    <id>execute-test-commands</id>
                    <phase>package</phase>
                    <goals>
                        <goal>sshexec</goal>
                    </goals>
                    <configuration>

                        <url>scp://root:tomcat@192.168.101.170</url>
                        <!-- 显示运行命令的输出结果 -->
                        <displayCommandOutputs>true</displayCommandOutputs>
                        <commands>
                            <command>ls -alh</command>
                            <command>/usr/share/tomcat/bin/tomcat stop</command>
                            <command>rm -rf /usr/share/tomcat/webapps/ROOT</command>
                            <command>unzip -o /usr/share/tomcat/webapps/myapp.zip -d /usr/share/tomcat/webapps/</command>
                            <command>/usr/share/tomcat/bin/tomcat start</command>
                        </commands>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

上面我们进行了命令操作和脚本操作,可以配置自己的项目情况来实现对项目的自动更新和重启

当然我们可以把两个execution合并,然后依次来执行。

注意:上面我们添加的execution的phase都是在package阶段,所以我们运行mvn package时会自动执行,如果要单独执行wagon-ssh,或者修改phase。可以使用下面命令来完成:

mvn -e  clean  wagon:upload wagon:sshexec

总结

上面三个插件大家可以根据自己的项目情况来配合使用,如有错误的地方欢迎大家留言提醒。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/407117.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣日记2.22-【回溯算法篇】47. 全排列 II

力扣日记&#xff1a;【回溯算法篇】47. 全排列 II 日期&#xff1a;2023.2.22 参考&#xff1a;代码随想录、力扣 47. 全排列 II 题目描述 难度&#xff1a;中等 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输…

07 Redis之持久化(RDB(Redis DataBase) + 写时复制 + AOF(Append Only File)+混合持久化)

4 Redis持久化 Redis 是一个内存数据库&#xff0c;然而内存中的数据是不持久的&#xff0c;若主机宕机或 Redis 关机重启&#xff0c;则内存中的数据全部丢失。 当然&#xff0c;这是不允许的。Redis 具有持久化功能&#xff0c;其会按照设置以快照或操作日志的形式将数据持…

用这款APP,世界听你的!

在这个科技日新月异的时代&#xff0c;我们的生活被各种手机软件所包围。几乎每个人都有一个甚至多个手机&#xff0c;你是否也有遇到过需要远程操作自己某一台手机的场景呢&#xff1f;今天&#xff0c;我要向大家推荐一款神奇的手机远程操作神器&#xff0c;让你可以随时随地…

vue3中ref创建变量取值时自动补充 .value 插件 volar

插件 TypeScript Vue Plugin (Volar) 设置中配置

HMI界面:是工业自动化的“窗口”,大有用武之地。

Hello&#xff0c;我是大千UI工场&#xff0c;本期分享HMI人机交互界面在工业自动化领域的应用&#xff0c;关注大千&#xff0c;学习N多UI干货&#xff0c;有设计需求&#xff0c;我们也可以接单。 HMI&#xff08;Human Machine Interface&#xff0c;人机界面&#xff09;在…

C++:派生类的生成过程(构造、析构)

目录 派生类的生成过程 派生类的构造函数与析构函数&#xff1a; 构造函数&#xff1a; 派生类组合类的构造和析构&#xff1a; 构造函数和析构函数调用顺序&#xff1a; 派生类的生成过程 三步骤&#xff1a; 吸收基类&#xff08;父类&#xff09;成员&#xff1a;实现代…

Java+Vue:宠物猫认养系统的未来之路

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

C++初阶:容器适配器priority_queue常用接口详解及模拟实现、仿函数介绍

介绍完了stack和queue的介绍以及模拟的相关内容后&#xff1a;C初阶&#xff1a;容器适配器介绍、stack和queue常用接口详解及模拟实现 接下来进行priority_queue的介绍以及模拟&#xff1a; 文章目录 1.priority_queue的介绍和使用1.1priority_queue的初步介绍1.2priority_que…

【C++私房菜】面向对象中的多态

文章目录 一、多态二、对象的静态类型和动态类型三、虚函数和纯虚函数1、虚函数2、虚析构函数3、抽象基类和纯虚函数4、多态的原理 四、重载、覆盖(重写)、隐藏(重定义)的对比 一、多态 OOP的核心思想是多态性(polymorphism)。多态性这个词源自希腊语&#xff0c;其含义是“多…

Sora - 探索AI视频模型的无限可能

Sora - 探索AI视频模型的无限可能 随着人工智能技术的飞速发展,AI视频模型已成为科技领域的新热点。而在这个浪潮中,OpenAI推出的首个AI视频模型Sora,以其卓越的性能和前瞻性的技术,引领着AI视频领域的创新发展。让我们将一起探讨Sora的技术特点、应用场景以及对未来创作方…

并发编程(4)共享模型之无锁

6 共享模型之无锁 本章内容 CAS 与 volatile原子整数原子引用原子累加器Unsafe 6.1 问题提出 有如下需求&#xff0c;保证 account.withdraw 取款方法的线程安全 import java.util.ArrayList; import java.util.List;interface Account {// 获取余额Integer getBalance();…

[已解决]npm淘宝镜像最新官方指引(2023.08.31)

最新的配置淘宝镜像的淘宝官方提供的方法 npm config set registry https://registry.npmmirror.com原来的 registry.npm.taobao.org 已替换为 registry.npmmirror.com &#xff0c;当点击 registry.npm.taobao.org 会默认跳转到 registry.npmmirror.com 如果你想将npm的下载…

【接口加密】接口加密的未来发展与应用场景

目录 3.1 接口加密与区块链技术的结合 3.1.1 区块链技术的安全特性与优势 3.1.2 接口加密在区块链中的应用案例 3.2 接口加密与物联网安全 3.2.1 物联网安全的挑战与需求 3.2.2 接口加密在物联网领域的实际应用 3.3 接口加密在金融与电子商务领域的应用 随着信息技术的不…

【前端素材】推荐优质后台管理系统Airmin平台模板(附源码)

一、需求分析 系统定义 后台管理系统是一种用于管理和监控网站、应用程序或系统的在线工具。它通常是通过网页界面进行访问和操作&#xff0c;用于管理网站内容、用户权限、数据分析等。后台管理系统是网站或应用程序的控制中心&#xff0c;管理员可以通过后台系统进行各种管…

一些不得不知道的概念!吴恩达deeplearning.ai:人工智能的导论

文章目录 强人工智能 AGI人工智能的分类深度学习AGI可能实现的一些证据一种学习算法的假设具体的例子 为什么人工智能如此高效 以下内容有任何不理解可以翻看我之前的博客哦 强人工智能 AGI 强人工智能也叫做通用人工智能&#xff0c;是人工智能学科发展的一个重要目标。 人…

spring框架介绍

spring 1.优点 1&#xff09;针对接口编程&#xff0c;解耦合 2&#xff09;aop&#xff1a;变向切面编程&#xff0c;动态增加功能 3&#xff09;方便集成框架&#xff0c;mybatis,hibernate,strust等 4&#xff09;降低j2ee接口的使用难度 2.spring是干什么的 管理bean及bean…

SPI总线结构和原理

一、概述 SPI&#xff08;Serial Peripheral Interface&#xff09;是一种同步串行通信接口标准&#xff0c;被广泛应用于各种微控制器和外设之间的通信。SPI总线结构简单、易于扩展&#xff0c;并且支持多主设备同时操作。 二、信号线 SCK&#xff08;Serial Clock&#xf…

【C++】模板初阶 | 泛型编程 | 函数模板 | 类模板

目录 1. 泛型编程 2. 函数模板 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5 模板参数的匹配原则 3. 类模板 3.1 类模板的定义格式 3.2 类模板的实例化 【本节目标】 1. 泛型编程 2. 函数模板 3. 类模板 1. 泛型编程 如何实现一…

C语言-指针详解速成

1.指针是什么 C语言指针是一种特殊的变量&#xff0c;用于存储内存地址。它可以指向其他变量或者其他数据结构&#xff0c;通过指针可以直接访问或修改存储在指定地址的值。指针可以帮助我们在程序中动态地分配和释放内存&#xff0c;以及进行复杂的数据操作。在C语言中&#…

三分钟快速搭建家纺行业小程序商城:轻松实现电子商务梦想

随着互联网的普及和移动设备的广泛使用&#xff0c;越来越多的商业活动正在向数字化转型。在这个过程中&#xff0c;小程序商城作为一种新型的电子商务模式&#xff0c;正逐渐受到商家的青睐。本文将通过具体步骤&#xff0c;指导读者如何开发一个纺织辅料小程序商城。 一、选择…