使用maven自動上傳、運行jar包


1 應用背景

​ 對於大型的項目,現在有很多CI/CD 持續集成/部署方式。如下圖:

img

但是對於小型項目來說,其實有時候用不到這么多東西。項目的體量、以及更新迭代、維護等方面,都不至於做如此自動化的流程。殺雞焉用宰牛刀嘛。

​ 不知道大家有沒有遇到過這樣的場景: 總是要用maven打包好項目,再用SSH 連接Linux服務器 ,再上傳jar包,然后使用shell命令啟動java應用。

為了避免這一重復操作,為大家介紹一款maven插件。可以一鍵上傳、部署運行java項目。

2. wagon-maven-plugin 插件自動打包部署jar包

2.1 配置Linux服務器用戶名和密碼

​ 在maven 的 settings.xml中添加:

<!--這一步可以省略:用戶名密碼可以手動輸入;也可以在下面配置服務器url的時候加上用戶名和密碼   -->
<servers>
    <server>
        <id>linux-server-dev</id>
        <username>root</username>
        <password>123456</password>
    </server>
</servers>

2.2 添加依賴

 <dependency>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>wagon-maven-plugin</artifactId>
            <version>2.0.0</version>
</dependency>

2.3 首先實現打包后,自動上傳jar包

​ 編輯pom.xml中的 標簽

<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即在settings.xml中配置的service的id -->
				<serverId>linux-server-dev</serverId>
                <!-- 要上傳到服務器的文件,一般來說是jar或者war包 -->
				<fromFile>target/project_name.jar</fromFile>
				<!-- 配置服務器的地址以及文件上傳的目錄。 -->
                <!-- 如果2.1 serverId配置省略了,可以這么寫:
				scp://user:password@192.168.1.1/home/project_name/	-->
				<!-- 注意上傳的路徑中不能帶有橫杠'-',例如/home/project-name ,否則會導致無法執行遠程shell命令 -->
                                <url>scp://192.168.1.1/home/project_name/</url>
			</configuration>
		</plugin>
	</plugins>
</build>

配置完成后,在cmd終端 cd到 項目pom.xml文件同一級, 運行命令:mvn clean package wagon:upload-single 打包並上傳。

2.4 實現自動啟動/重啟java應用

編輯pom.xml中的 標簽:

<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>linux-server-dev</serverId>
				<fromFile>target/project_name.jar</fromFile>
				<url>scp://192.168.20.128/home/project_name/</url>
				<commands>
                    <!-- 啟動/重啟jar包的shell腳本,需要自己編寫,放在/home/project_name 目錄下即可-->
					<command>sh ./restart.sh</command>
                     <!-- 也可以直接執行命令-->
                    <command><![CDATA[nohup java -jar /home/project_name/xx.jar &]]><command>
				</commands>
				<!-- 顯示運行命令的輸出結果 -->
				<displayCommandOutputs>true</displayCommandOutputs>
			</configuration>
		</plugin>
	</plugins>
</build>

運行命令:mvn clean package wagon:upload-single wagon:sshexec

打包、上傳、執行shell腳本或者命令

2.5 maven install 一鍵打包、部署

如果覺得每次輸入 mvn clean package wagon:upload-single wagon:sshexec 還是很麻煩的話。可以配置execution

<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>linux-server-dev</serverId>
                        <fromFile>target/project_name.jar</fromFile>
                        <url>scp://192.168.20.128/home/project_name/</url>
                        <commands>
                            <!-- 啟動/重啟jar包的shell腳本,需要自己編寫,放在/home/project_name 目錄下即可-->
                            <command>sh ./restart.sh</command>
                             <!-- 也可以直接執行命令-->
                            <command><![CDATA[nohup java -jar /home/project_name/xx.jar &]]><command>
                        </commands>
                        <!-- 顯示運行命令的輸出結果 -->
                        <displayCommandOutputs>true</displayCommandOutputs>
                    </configuration>
                    </execution>
			</executions>
		</plugin>
	</plugins>
</build>

配置完后mvn clean package 即可 一鍵打包部署。

我用的是spring tools suite (其實就是eclipse )開發,右鍵項目-> Run as -> maven install 就直接一鍵 打包部署了。因為maven install 里包含了 package 這個命令。關於shell

3.后記

3.1使用的時候遇到了一個小問題

就是總是讓我輸入服務器密碼。提示:

Keyboard interactive required, supplied password is ignored

交互式面板,提供的密碼被忽略。google了一下。
StackOverflow找到了一篇問答。

img
vi /etc/ssh/sshd_config

service sshd restart 修改之后重啟服務

3.2 shell命令參考

​ 這里提供 殺掉 老的服務啟動進程命令。jar包的啟動命令自己添加。

​ 如果有啟動進程才執行kill ,這樣判斷的好處是,如果沒有服務運行,執行kill腳本,不會再提示參數不夠了。

#killold.sh
if [[ -n $(ps -ef | grep 項目的部分名稱* | grep -v grep ) ]]; then
echo  'kill old process'
ps -ef | grep 項目的部分名稱* | grep -v grep | awk '{print $2}' | xargs kill -9
fi

以下我的具體配置。 為什么java -jar 啟動命令 沒有和 killold.sh 寫在同一個腳本呢? 一開始是寫在一起的叫 restart.sh 不過新的服務總是啟動不了。就拆開寫了。讀者可以自己試一試。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM