侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 292 篇文章
  • 累计创建 132 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

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

孔子说JAVA
2021-09-22 / 0 评论 / 0 点赞 / 177 阅读 / 11,760 字 / 正在检测是否收录...

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打包后会在 target目录 下生成jar/war包。

2、SpringBoot maven项目打jar包

2.1 打完整jar包(包括lib)

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

2.1.1 指定打包方式为jar

将打包方式修改为jar,具体代码见下面的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包。

image-1649170664208

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 地址进入下载页面,选择一个版本如WinSW v2.11.0进入。

image-1649171216246

2)下载winsw

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

image-1649171343413

4.1.2 组建服务目录

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

image-1649171375476

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

image-1649171541078

4.2 使用Procrun配置windows服务

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

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

4.2.1 下载Procrun

image-1649171606491

解压缩

image-1649171624533

4.2.2 组织目录设置

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

image-1649171654740

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

image-1649171667333

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

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

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

image-1649171720588

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

4.2.3 编写安装服务的脚本

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

image-1649171802593

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。

image-1649171916161

4.2.5 安装windows服务

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

image-1649171937250

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

image-1649171959463

4.2.6 启动windows服务

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

image-1649171991221

image-1649172015711

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

image-1649172035134

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

4.2.7 卸载服务

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

image-1649172059520

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

5、war包部署

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

0

评论区