SpringBoot maven项目打jar包并部署到 linux/windows服务

Posted 孔子-说

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot maven项目打jar包并部署到 linux/windows服务相关的知识,希望对你有一定的参考价值。

目录

1、SpringBoot maven项目打包方式

1.1  jar 包优缺点

1.2  war包优缺点

2、SpringBoot maven项目打jar包

2.1 打完整jar包(包括lib)

2.1.1 指定打包方式为jar

2.1.2 添加打包插件plugin

2.1.3 打完整jar包(包括lib)

2.2 打不完整jar包(不包括lib)

2.2.1 方式一:修改pom文件的打包配置

2.2.2 方式二:通过命令打包

2.3 打war包

2.3.1 指定打包方式为war

2.3.2 排除tomcat的配置

2.3.2 打war包

3、jar包部署 - 命令行

3.1 命令行运行jar包

3.1.1 windows命令行运行jar包

3.1.2 linux命令行运行jar包

3.2 批处理运行jar包

4、jar包部署 - 作为windows服务运行

4.1 使用WinSW配置windows服务

4.1.1 下载

4.1.2 组建服务目录

4.1.3 修改demoService.xml配置

4.1.4 安装服务

4.1.5 启动或停止服务

4.1.6 卸载服务

4.2 使用Procrun配置windows服务

4.2.1 下载Procrun

4.2.2 组织目录设置

4.2.3 编写安装服务的脚本

4.2.4 编写卸载服务的脚本

4.2.5 安装windows服务

4.2.6 启动windows服务

4.2.7 卸载服务

5、war包部署


SpringBoot是在Spring的基础之上产生的(准确的说是在Spring4.0)的版本的基础之上,其中“Boot”的意思就是“引导”,意在简化开发模式,是开发者能够快速的开发出基于Spring的应用,SpringBoot极大简化了配置,并且遵守约定优于配置的原则,即使零配置也能正常运行。SpringBoot含有一个内嵌的web容器使之可以独立运行,所以我们开发的web应用不需要作为war包部署到web容器中,而是作为一个jar包,在启动时根据web服务器的配置进行加载。如果有需要也可以通过配置打包成war包部署到特定的web容器。本篇文章主要介绍eclipse/idea如何简单快捷的打包项目,并部署到 linux/windows 服务器上。

1、SpringBoot maven项目打包方式

在idea/eclipse中,使用maven命令/工具打包,可以将项目打包成为war/jar,两种方式应用场景不一样,各有优缺点。

1.1  jar 包优缺点

通过maven插件spring-boot-maven-plugin打包,在进行打包时,会动态生成jar的启动类org.springframework.boot.loader.JarLauncher,借助该类对springboot应用程序进行启动。

优点:

  1. 本地无需搭建web容器,方便开发和调试。
  2. 因为自带web容器,可以避免由于web容器的差异造成不同环境结果不一致问题。
  3. 一个jar包就是全部,方便应用扩展。
  4. 借助容器化,可以进行大规模的部署。

缺点:

  1. 应用过于独立,难以统一管理。
  2. 数据源无法通过界面进行管理。
  3. 应用体积过大。
  4. 修改web容器相关配置较为困难,需要借助代码实现。

1.2  war包优缺点

以war包方式运行,通过maven插件spring-boot-maven-plugin进行相关配置后,最终生成一个可运行在tomcat,weblogic等java web容器中的war包。

优点:

  1. 可以借助web容器管理界面对应用进行管理。
  2. 可以管理JNDI数据源。
  3. web容器配置较为灵活,配置和程序分离。
  4. 应用体积较小,甚至可以借助web容器的包管理功能(比如weblogic Library)进一步减小应用大小。

缺点:

  1. 本地需要搭建web容器,对本地环境要求更高点,学习成本也响应更高。
  2. 调试较为困难,需要借助web容器。
  3. 无法兼容所有web容器(比如spring boot2.x无法运行在weblogic 11g上)。
  4. 部署较为困难(比如和weblogic有较多的类冲突)

打war包需要修改pom配置,或者使用项目下bin目录中的脚本进行打包。在idea中使用maven打包后会在RuoYi-Vue\\ruoyi-admin\\target目录下生成jar/war包。

2、SpringBoot maven项目打jar包

2.1 打完整jar包(包括lib)

打开maven项目的pom.xml文件。

2.1.1 指定打包方式为jar

将打包方式修改为<packaging>jar</packaging>,具体代码见下面的packaging:

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>bsp</artifactId>
        <groupId>com.der</groupId>
        <version>1.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <!-- 打包方式为jar -->
    <packaging>jar</packaging>
    <artifactId>bsp-admin</artifactId>

    <description>
        web服务入口
    </description>

    <dependencies>

    </dependencies>
    <build>

    </build>
</project>

2.1.2 添加打包插件plugin

找到build- >plugins 标签,在其中添加 spring-boot-maven-plugin 打包插件。以下为最简化形式。

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <version>2.1.1.RELEASE</version>
    </plugin>
    
  </plugins>
</build>

以下配置中的<finalName>标签是指定打包之后的文件名,不设置则默认使用模块名称+版本号。<mainClass>您可以通过使用配置选项或通过Main-Class以常规方式向清单添加属性来指定要启动的主类。如果未指定主类,则插件会使用public static void main(String[] args)方法搜索类 。repackage在Maven的package生命周期阶段,能够将mvn package生成的软件包,再次打包为可执行的软件包,并将mvn package生成的软件包重命名为*.original。

<build>
  <!-- 生成的打包文件名称,这里引用项目的artifactId -->
  <finalName>${project.artifactId}</finalName>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <version>2.1.1.RELEASE</version>
      <configuration>
        <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
        <mainClass>com.pancm.App</mainClass><!-- 指定main函数, 非必填 -->
      </configuration>
      <executions>
        <execution>
          <goals>
            <goal>repackage</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    
  </plugins>
</build>

2.1.3 打完整jar包(包括lib)

打开idea右侧的maven标签,双击Lifecycle下的package进行打包,当然也可以在idea控制台使用 maven命令(mvn clean package)打包。 打包成功后,在target目录下可以看到生成了jar包(***.jar),该jar包较大,包括了该项目依赖的所有lib包。 

使用压缩软件打开jar包,可以看到包含BOOT-INF、META-INF、org3个目录,在BOOT-INF目录下包括lib子目录,这里包括了该项目依赖的所有jar包。

2.2 打不完整jar包(不包括lib)

若每次打包都包括lib,部署拷贝文件的时候会非常慢,而且lib每次都一样,所以可以把lib包独立出来放在服务器固定目录,每次只打包不包括lib的jar包。所有配置同打完整jar包2.1,不同部分如下:

2.2.1 方式一:修改pom文件的打包配置

修改pom.xml文件中的spring-boot-maven-plugin配置,打包时不再包括lib。再次打包后,jar包仅为167KB,使用压缩软件打开该jar包,在***.jar\\BOOT-INF目录下仅剩下classes目录,已没有lib目录。pom打包配置如下。

<plugin>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-maven-plugin</artifactId>
     <version>2.1.1.RELEASE</version>
     <configuration>
         <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
         <!-- 打包去除lib配置begin -->
         <mainClass>com.ruoyi.RuoyiApplication</mainClass>
         <layout>ZIP</layout>
         <includes>
            <include>
               <groupId>nothing</groupId>
               <artifactId>nothing</artifactId>
            </include>
         </includes>
         <!-- 打包去除lib配置end -->
     </configuration>
     <executions>
         <execution>
            <goals>
               <goal>repackage</goal>
            </goals>
         </execution>
     </executions>
</plugin>

2.2.2 方式二:通过命令打包

通过命令打包,在idea工具中输入以下命令打包:mvn clean dependency:copy-dependencies -DoutputDirectory=target/lib package。

以上两种方式打包都可以,最终的jar包已经排除掉了lib文件。推荐第一种方便快捷。

2.3 打war包

2.3.1 指定打包方式为war

修改pom.xml文件,找到<packaging>jar</packaging>,修改为<packaging>war</packaging>。

2.3.2 排除tomcat的配置

修改pom.xml文件,在<dependencies></dependencies>标签之间添加spring-boot-starter-web依赖,增加排除tomcat的配置。打jar包时该配置需要去掉或注释。

<!-- SpringBoot Web容器 -->
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <!-- 打包时排除tomcat的配置begin, 打jar包时需要注释掉-->
      <exclusions>
            <exclusion>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
      </exclusions>
      <!-- 打包时排除tomcat的配置end, 打jar包时需要注释掉-->
</dependency>

2.3.2 打war包

打开idea右侧的maven标签,双击Lifecycle下的package进行打包,当然也可以在idea控制台使用 maven命令(mvn clean package)打包。 打包成功后,在target目录下生成了***.war。部署时可以改为指定的名字。

3、jar包部署 - 命令行

springboot已内置了tomcat容器,可以直接打jar包运行,不需要额外部署tomcat。

  1. 应用服务器上新建一个 app 目录,将打包后的jar文件放在该目录下;
  2. 在 app 目录下新建config目录,用于放置需要的配置文件,如application.yml,application-prod.yml,logback.xml等文件,修改数据库连接、应用端口及访问路径配置。
  3. 若部署不完整jar包,需在 app 目录下新建 lib 目录,存放该项目依赖的所有jar,可以把完整jar包解压后的lib中所有jar放入该lib目录。

说明:配置文件放在config目录是为了以后修改端口号以及数据库连接等信息方便,直接修改yml配置文件即可,不需要重现打包jar,springboot加载配置文件顺序是:

  1. /config/application.yml
  2. /application.yml
  3. classpath:/config/application.yml
  4. classpath:/application.yml

3.1 命令行运行jar包

3.1.1 windows命令行运行jar包

打开dos窗口,进入 app 目录,执行java -jar -Dloader.path=./lib ***.jar启动服务;若部署的是包括lib的完整jar包,执行命令java -jar ***.jar。

// 使用外部lib命令,-Dloader.path后跟的是lib目录
java -jar -Dloader.path=./lib ***.jar

// 完整jar执行,该jar已经包括了所有依赖的lib
java -jar ***.jar。
  • jar运行可以通过指定参数spring.config.location引用外部文件,命令参考如下:
// config目录存放properties配置文件
java -jar ***.jar --spring.config.location=/workspace/config 
  • 可以通过配合spring.profiles.active参数可以指定目录下配置文件,如:
// 以下命令会读取/workspace/config/appliction-prod.properties文件作为配置文件。
java -jar ***.jar --spring.profiles.active=prod --spring.config.location=/workspace/config
  •  在启动的时候指定端口号,需要在jar包后面加上 --server.port = 8888
java -jar ***.jar --server.port=8888

3.1.2 linux命令行运行jar包

用连接 Linux 的工具先切换到项目 jar 包所在目录,执行 nohup java -jar ***.jar &, 通过该命令运行的jar包以后台的形式运行,关闭shell窗口也不影响已运行的项目。而通过java -jar ***.jar的方式运行的项目会在该shell窗口关闭后停止服务。

nohup java -jar ***.jar &
  • 若有多个jdk安装目录,尤其默认的版本不是1.8以上的,需要指定目录  /opt/jdk1.8.0_131/bin/java -jar ***.jar
nohup /opt/jdk1.8.0_131/bin/java -jar -Dspring.config.location=/opt/application.properties /opt/***.jar --server.port=8080 &

3.2 批处理运行jar包

可以通过批处理脚本执行,在app目录下新建run-app.bat,录入以下执行脚本,保存后双击执行即可。关闭运行窗口即可关闭服务。

java -jar -Dloader.path=./lib ***.jar
pause

4、jar包部署 - 作为windows服务运行

4.1 使用WinSW配置windows服务

4.1.1 下载

1) 通过 winsw 地址进入下载页面,选择一个版本如WinSW v2.11.0进入。

2) 在版本的详情页面往下拉,可以看到下载链接,下载sample-minimal.xml、WinSW-x64.exe这两个文件。这里WinSW-x64.exe表示64位操作系统,WinSW-x86.exe表示32位操作系统。

4.1.2 组建服务目录

下载完成后,将下载的两个文件及springboot项目的jar包放在同一个文件夹中。需要将WinSW-x64.exe执行程序跟xml改成同样的名字,推荐使用项目名+Service的命名方式,比如:WinSW-x64.exe改成 demoService.exe,sample-minmal.xml 改成demoService.xml。

4.1.3 修改demoService.xml配置

<configuration> 
     <id>demo-id</id> 
     <name>springbootdemo</name>
     <description>This is springbootdemo service.</description>
     <executable>java</executable> 
     <arguments>-jar demo.jar</arguments>
     <!-- 开机启动 -->
     <startmode>Automatic</startmode>
     <!-- 日志配置 -->
     <logpath>logs/service</logpath>
     <logmode>rotate</logmode>
 </configuration>

arguments参数还可以指定虚拟机参数,配置文件路径等,如:

<arguments>-Xms256m -Xmx256m -jar "%BASE%\\demo.jar" -Dspring.config.additional-location=application-db.properties</arguments>

4.1.4 安装服务

使用管理员身份打开cmd,进入该文件所在目录。如:D:\\app\\winsw>,执行命令:demoService.exe install, 待提示服务安装成功(Service 'springbootdemo (demo-id)' was installed successfully.)。

D:\\app\\winsw>demoService.exe install
2021-09-22 18:01:18,159 INFO  - Installing service 'springbootdemo (demo-id)'...
2021-09-22 18:01:18,188 INFO  - Service 'springbootdemo (demo-id)' was installed successfully.

4.1.5 启动或停止服务

进入windows服务管理器,找到对应服务springbootdemo,启动/停止。或通过dos命令启动/停止。

// 启动服务
net start springbootdemo

// 停止服务
net stop springbootdemo
  • 此处有一个坑,如果提示:FATAL - WMI Operation failure: AccessDenied  则可以使用管理员身份打开cmd进行安装。

4.1.6 卸载服务

若需要卸载服务,需先停止该服务,cmd进入该文件所在目录,执行命令:demoService.exe uninstall。

demoService.exe uninstall

4.2 使用Procrun配置windows服务

Procrun是Apache推出的一套能让Java应用程序在Windows平台以服务的方式运行的插件。它主要包括两个程序:

  • 服务应用程序(名为prunsrv.exe),用于转换任一应用程序作为Win服务运行。
  • 监视器应用程序(名为prunmgr.exe),用于监视和配置procrun服务。

4.2.1 下载Procrun

下载地址: http://www.apache.org/dist/commons/daemon/binaries/windows/
下载名为:commons-daemon-1.2.4-bin-windows.zip的压缩包,如下图:

 解压缩

4.2.2 组织目录设置

创建一个springbootdemo目录,然后在其下创建三个文件夹,分别是JAR、Logs和Service,如下图:

JAR文件夹,用来放Spring打出来的jar包,如下图:

Logs文件夹用来保存Win Service的运行日志,目前是空的。

Service文件夹用来存放Procrun的exe。

  • 1、首先,将解压的commons-daemon-1.2.4-bin-windows\\amd64文件夹下的prunsrv.exe,拷贝到Service文件夹中,如下图: 

  • 2、其次,将commons-daemon-1.2.4-bin-windows文件夹下的prunmgr.exe,拷贝到Service文件夹中,并重命名为SpringBootDemo.exe(这里名字SpringBootDemo为服务的英文名称,在安装和卸载服务脚本中均需用到),如下图:

4.2.3 编写安装服务的脚本

1)用压缩软件打开jar包的META-INF\\MANIFEST.MF文件,找到Main-Class为 org.springframework.boot.loader.JarLauncher,在下面的安装服务脚本中会用到。

 2)编写install.bat,在Service目录下新建install.bat文件,编辑,输入以下脚本。

@echo off
 
rem 设置程序名称
set SERVICE_EN_NAME=SpringBootDemo
set SERVICE_CH_NAME=SpringBoot演示服务
 
rem 设置java路径
set JAVA_HOME=%JAVA_HOME%
 
rem 设置程序依赖及程序入口类
cd..
set BASEDIR=%CD%
set CLASSPATH=%BASEDIR%\\JAR\\demo.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
  • SERVICE_EN_NAME=SpringBootDemo: 服务英文名称,用dos命令启停服务时使用。
  • SERVICE_CH_NAME=SpringBoot演示服务:服务中文名称,显示在windows的服务列表中。
  • CLASSPATH=%BASEDIR%\\JAR\\demo.jar:JAR路径下的jar包
  • MAIN_CLASS=org.springframework.boot.loader.JarLauncher:jar包中的Main-Class

4.2.4 编写卸载服务的脚本

在Service目录下新建uninstall.bat文件,编辑,输入以下脚本。

@echo off
 
cd..
set basedir=%CD%
set SERVICE_NAME=SpringBootDemo
set SRV=%BASEDIR%\\Service\\prunsrv.exe
echo 正在卸载服务...
"%SRV%" //DS//%SERVICE_NAME%
echo 服务卸载完毕。
pause
  • 注意:这里的SERVICE_NAME名字对应install.bat中的SERVICE_EN_NAME。

4.2.5 安装windows服务

Service文件夹内,双击执行install.bat,如下图:

提示“安装服务完成”后,在Windows任务栏的搜索框中直接输入“服务”或者“Service”,就可以打开Windows服务,如下图: 

4.2.6 启动windows服务

1)Service文件夹内,双击打开prunmgr-springbootdemo.exe,点击“开始”按钮,若如果一切正常的话,服务就可以成功启动了。

  •  注意,如果服务起不来的话,一定要去检查Procrun的log:

  • 说明:启停服务也可以直接在windows服务列表中操作。 

4.2.7 卸载服务

如果想要卸载服务,先停用服务后,运行uninstall.bat即可,如下图:

这时候刷新windows服务列表,可以看到该服务已不存在。 

5、war包部署

将2.3打包的***.war放在服务器tomcat的webapps目录下,启动tomcat,根据启动日志或浏览器访问确认是否启动成功。

以上是关于SpringBoot maven项目打jar包并部署到 linux/windows服务的主要内容,如果未能解决你的问题,请参考以下文章

如何将springboot项目打包成jar包并部署到服务器上

SpringBoot——SpringBoot打jar包并部署到Tomcat

SpringBoot打war包并部署到tomcat下运行

springboot项目用maven打jar包

05_SpringBoot打jar/war包解决第三方依赖jar包的问题

从零开始打jar包