文章目錄
- 前言
- 一、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中來使用它提供的一些系統屬性,目前主要提供了下面這些屬性:
Property | Description | value |
---|---|---|
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
- 第一次打包生成文件:pkg-sb-1.0.1.jar
- 第二次打包生成文件: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
總結
上面三個插件大家可以根據自己的項目情況來配合使用,如有錯誤的地方歡迎大家留言提醒。