SpringBoot maven项目打jar包并部署到 linux/windows服务
Posted 孔子-说
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot maven项目打jar包并部署到 linux/windows服务相关的知识,希望对你有一定的参考价值。
目录
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应用程序进行启动。
优点:
- 本地无需搭建web容器,方便开发和调试。
- 因为自带web容器,可以避免由于web容器的差异造成不同环境结果不一致问题。
- 一个jar包就是全部,方便应用扩展。
- 借助容器化,可以进行大规模的部署。
缺点:
- 应用过于独立,难以统一管理。
- 数据源无法通过界面进行管理。
- 应用体积过大。
- 修改web容器相关配置较为困难,需要借助代码实现。
1.2 war包优缺点
以war包方式运行,通过maven插件spring-boot-maven-plugin进行相关配置后,最终生成一个可运行在tomcat,weblogic等java web容器中的war包。
优点:
- 可以借助web容器管理界面对应用进行管理。
- 可以管理JNDI数据源。
- web容器配置较为灵活,配置和程序分离。
- 应用体积较小,甚至可以借助web容器的包管理功能(比如weblogic Library)进一步减小应用大小。
缺点:
- 本地需要搭建web容器,对本地环境要求更高点,学习成本也响应更高。
- 调试较为困难,需要借助web容器。
- 无法兼容所有web容器(比如spring boot2.x无法运行在weblogic 11g上)。
- 部署较为困难(比如和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。
- 应用服务器上新建一个 app 目录,将打包后的jar文件放在该目录下;
- 在 app 目录下新建config目录,用于放置需要的配置文件,如application.yml,application-prod.yml,logback.xml等文件,修改数据库连接、应用端口及访问路径配置。
- 若部署不完整jar包,需在 app 目录下新建 lib 目录,存放该项目依赖的所有jar,可以把完整jar包解压后的lib中所有jar放入该lib目录。
说明:配置文件放在config目录是为了以后修改端口号以及数据库连接等信息方便,直接修改yml配置文件即可,不需要重现打包jar,springboot加载配置文件顺序是:
- /config/application.yml
- /application.yml
- classpath:/config/application.yml
- 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