SpringBoot打包部署成Windows服務的詳細步驟

1.SpringBoot

這裏的SpringBoot項目就寫一個最基礎的SpringBoot就行了,本文的重點是演示如何將SpringBoot打包部署成jar包,然後部署成Windows服務的過程。

1.1 pom.xml

個人習慣先上POM,雖然這個demo沒什麼東西,但是我覺得上Java代碼之前先上POM是對讀者最起碼的尊重,哈哈哈哈。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.7.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.demo</groupId>
	<artifactId>springforwinservice</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>springforwinservice</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

1.2 項目代碼

1.2.1 項目結構

怎麼創建SpringBoot項目網上的資料太多了,我就不在這裏獻醜了,直接上代碼。項目的結構很簡單就是三層:Controller、Service和Model,如下圖:
在這裏插入圖片描述

1.2.2 Controller的代碼

package com.demo.springforwinservice.ctrl;

import com.demo.springforwinservice.impl.DemoService;
import com.demo.springforwinservice.model.Message;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoControler {
    @Autowired
    private DemoService demoService;

    @ResponseBody
    @RequestMapping(value = "/message",produces = "application/json", method = RequestMethod.GET)
    public Message getMessage() {

        Message msg = demoService.getMsg();

        return msg;
    }
}

1.2.3 Service的代碼

package com.demo.springforwinservice.impl;

import com.demo.springforwinservice.model.Message;
import org.springframework.stereotype.Service;

@Service
public class DemoService {

    public Message getMsg(){
        Message msg = new Message(0, "Success!");
        return  msg;
    }
}

1.2.4 Model的代碼

package com.demo.springforwinservice.model;

public class Message {
    //0表示成功;-1表示失敗
    private int status;
    //消息
    private String message;

    public int getStatus(){
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message){
        this.message = message;
    }

    public Message(int status, String massage) {
        this.status = status;
        this.message = massage;
    }
}

1.3 運行結果

寫完上述代碼後,給項目配置一個未被佔用的端口號,就可以運行起來檢查結果了。我這裏使用接口開發的神器:Postman。如下圖:
在這裏插入圖片描述
接口可以成功調用,證明項目沒有問題。

2.SpringBoot打包成jar

2.1 打包

我是直接使用Maven打的包,如下圖:
在這裏插入圖片描述
打包完成後,會在項目路徑下生成一個target文件夾,如下圖:
在這裏插入圖片描述
紅線裏就是打出來的jar包。

2.2 驗證jar包

打出來jar包後,先不要着急部署成Win服務,最好先驗證下jar包是否可用。
下面在控制檯中啓動:
在這裏插入圖片描述
然後同樣使用Postman進行接口調用:
在這裏插入圖片描述
沒有問題。

3.配置Procrun

驗證jar包好用之後,就是本篇的重點了,配置Procrun。
Procrun是Apache推出的一套能讓Java應用程序在Windows平臺以服務的方式運行的插件。它主要包括兩個程序:

  • 服務應用程序(名爲prunsrv.exe),用於轉換任一應用程序作爲Win服務運行。
  • 監視器應用程序(名爲prunmgr.exe),用於監視和配置procrun服務。

3.1 下載Procrun

當時我找這個下載地址還很費了一點勁兒哈哈。
地址爲: http://www.apache.org/dist/commons/daemon/binaries/windows/
下載名爲:commons-daemon-1.2.0-bin-windows.zip的壓縮包,如下圖:
在這裏插入圖片描述
下載並解壓後,長這個樣子:
在這裏插入圖片描述

3.2 組織目錄設置

首先我們創建一個目錄,比如我這裏叫做SpringForWinServiceDemo_Procrun,然後在其下創建三個文件夾,分別是JAR、Logs和Service,如下圖:
在這裏插入圖片描述
JAR文件夾,用來放Spring打出來的jar包,如下圖:
在這裏插入圖片描述
Logs文件夾用來保存Win Service的運行日誌,目前是空的。
Service文件夾用來存放Procrun的exe。首先,將解壓的commons-daemon-1.2.0-bin-windows\amd64文件夾下的prunsrv.exe,拷貝到Service文件夾中,如下圖:
在這裏插入圖片描述
其次,將commons-daemon-1.2.0-bin-windows文件夾下的prunmgr.exe,拷貝到Service文件夾中,並重命名,我這裏命名爲SpringForWinServiceDemo.exe,如下圖:
在這裏插入圖片描述
這樣組織目錄就設置好了。

3.3 編寫安裝服務的腳本

在編寫安裝服務的腳本install.bat之前,有個非常重要,但是非常容易被忽視的問題(別的博客也沒有提到過),這個問題會直接影響你的服務是否能夠運行起來,那就是:
確認你的jar包的Main-Class”。
對於我這個工程,我最開始想都不想,就覺得jar包裏的Main-Class就是com.demo.springforwinservice.SpringforwinserviceApplication,然後配到腳本里,服務倒是裝上了,但是怎麼都啓動不起來。。。蛋疼,最後搞了半天才得以解決,方法如下:
找到jar包,使用壓縮軟件打開,如下圖:
在這裏插入圖片描述
進入這個META-INF文件夾,使用記事本打開MANIFEST.MF文件,如下圖
在這裏插入圖片描述
看見了麼,Main-Class是org.springframework.boot.loader.JarLauncher,而不是com.demo.springforwinservice.SpringforwinserviceApplication。
確定了這個後,開始寫install.bat,如下:

@echo off
 
rem 設置程序名稱
set SERVICE_EN_NAME=SpringForWinServiceDemo
set SERVICE_CH_NAME=Spring演示服務
 
rem 設置java路徑
set JAVA_HOME=%JAVA_HOME%
 
rem 設置程序依賴及程序入口類
cd..
set BASEDIR=%CD%
set CLASSPATH=%BASEDIR%\JAR\springforwinservice-0.0.1-SNAPSHOT.jar
set MAIN_CLASS=org.springframework.boot.loader.JarLauncher
 
rem 設置prunsrv路徑
set SRV=%BASEDIR%\Service\prunsrv.exe
 
rem 設置日誌路徑及日誌文件前綴
set LOGPATH=%BASEDIR%\Logs
 
rem 輸出信息
echo SERVICE_NAME: %SERVICE_EN_NAME%
echo JAVA_HOME: %JAVA_HOME%
echo MAIN_CLASS: %MAIN_CLASS%
echo prunsrv path: %SRV%
 
rem 設置jvm
if "%JVM%" == "" goto findJvm
if exist "%JVM%" goto foundJvm
:findJvm
set "JVM=%JAVA_HOME%\jre\bin\server\jvm.dll"
if exist "%JVM%" goto foundJvm
echo can not find jvm.dll automatically,
echo please use COMMAND to localation it
echo then install service
goto end
:foundJvm
echo 正在安裝服務...
rem 安裝
"%SRV%" //IS//%SERVICE_EN_NAME% --DisplayName="%SERVICE_CH_NAME%" "--Classpath=%CLASSPATH%" "--Install=%SRV%" "--JavaHome=%JAVA_HOME%" "--Jvm=%JVM%" --JvmMs=256 --JvmMx=1024 --Startup=auto --JvmOptions=-Djcifs.smb.client.dfs.disabled=false ++JvmOptions=-Djcifs.resolveOrder=DNS --StartMode=jvm --StartClass=%MAIN_CLASS% --StartMethod=main --StopMode=jvm --StopClass=%MAIN_CLASS% --StopMethod=main --StopParams=  --LogPath=%LOGPATH% --StdOutput=auto --StdError=auto
echo 安裝服務完成。
pause

詳細解釋如圖:
在這裏插入圖片描述

3.4 編寫卸載服務的腳本

卸載服務的uninstall.bat腳本比較簡單,編寫完成後同樣放到Service文件夾下即可,如下:

@echo off
 
cd..
set basedir=%CD%
set SERVICE_NAME=SpringForWinServiceDemo
set SRV=%BASEDIR%\Service\prunsrv.exe
echo 正在卸載服務...
"%SRV%" //DS//%SERVICE_NAME%
echo 服務卸載完畢。
pause

4.部署Windows服務

4.1 安裝服務

執行install.bat,如下圖:
在這裏插入圖片描述
提示“安裝服務完成”後,在Windows任務欄的搜索框中直接輸入“服務”或者“Service”,就可以打開Windows服務,如下圖:
在這裏插入圖片描述
在這裏插入圖片描述
看,服務已經裝好了。

4.2 啓動服務

裝好的服務還沒有啓動,我們需要手動將其啓動,回到Service文件夾,雙擊打開SpringForWinServiceDemo.exe,然後點擊“開始”,如下:
在這裏插入圖片描述
如果一切正常的話,服務就可以成功啓動了,如下圖:
在這裏插入圖片描述
再次回到Windows服務列表頁,可以看到服務的狀態爲“正在運行”,如下圖:
在這裏插入圖片描述
注意,如果服務起不來的話,一定要去檢查Procrun的log,在這裏:
在這裏插入圖片描述

4.3 調用服務

仍然使用Postman,來調用下這個Windows服務的接口,如下圖:
在這裏插入圖片描述
Good, every good!
本地服務部署成功咯~~

4.4 卸載服務

如果想要卸載服務,運行uninstall.bat即可,如下圖:
在這裏插入圖片描述
然後重啓電腦即可看見對應的服務已經沒有了~~~~
(怎麼才能在不重啓電腦的前提下,徹底卸載刪除服務的方法我摸索了半天也沒找到,所以歡迎大家交流以及批評指正~~~)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章