目录
一、打包为JAR包并运行
Spring Boot 应用内嵌了 Web 服务器,所以基于 Spring Boot 开发的 web应用也可以独立运行,无须部署到其他 Web服务器中。下面以打包demo_test1项目为例,将 Spring Boot 项目打包为可执行的 JAR 包并运行,具体操作如下。
1.打包为可执行的 JAR 包
(1)添加Maven打包插件
SpringBoot程序是基于 Maven 创建的,在对SpringBoot 项目进行打包前,需要在项目pom.xml文件中加入 Maven 打包插件,Spring Boot 为项目打包提供了整合后的 Maven 打包插件 spring-boot-maven-plugin,可以直接使用,具体代码如下。
<build>
<plugins>
<!--Maven打包插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
</plugin>
</plugins>
</build>
(2)使用IDEA进行打包
在Maven中提供了package 打包指令,IDEA 中也提供了非常便捷的项目打包支持。在此选择在IDEA中对项目进行打包。在IDEA中单击右侧的“Maven”工具栏,会弹出 Maven 的操作界面,如图所示。
Lifecycle(生命周期)下展示了 Maven 项目构建生命周期中常用的命令,选中对应的命令双击后可以快速执行该Maven 命令。其中,clean 命令可以清除所有在构建过程中生成的文件,test 命令可以使用合适的单元测试框架来测试编译的源代码,package 命令可以完成项目编译、单元测试、打包功能。
为了确保打包后的项目为最新编译的代码,并且不包含测试阶段的代码,可以在打创前先执行 clean 命令,在跳过测试阶段的模块后进行打包。首先在 Maven 操作界面中双击“clean”执行清除 target 操作,然后单击界面上方的图标设置打包时跳过测试阶段的模块,最后双击“package”执行打包操作。执行打包操作后,会在控制台中输出打包的结果,如果打包成功会在项目的target 文件夹下创建项目对应的可执行JAR包,如图所示。
2.运行 JAR 包
一个可执行的 JAR包可以由 Java虚拟机(Java Virtual Machine,JVM)直接执行而无须事先提取文件或者设置类路径。对此可以直接使用Java命令运行可执行的JAR包,运行JAR 包的命令的语法格式如下。
java -jar JAR包名称
JAR包名称为包含 JAR后缀的完整名称。
运行JAR包时可以选择在IDEA中或者在cmd窗口中执行,这里选择在cmd窗口中执行。在本地打开项目的target 文件夹,如图所示。
在地址栏中输人“cmd”后按下“Enter”键,在当前文件夹路径下打开 cmd窗口,并在弹出的 cmd 窗口中使用 Java 命令运行 chapter01-0.0.1-SNAPSHOT.jar,如图所示。
可以看出,Spring Boot项目打成的JAR 包已经成功运行,并显示了默认的端口号8080。需要注意的是,由于执行Java命令需要计算机中安装了Java的JDK环境,如果没有安装的话,执行后会报错。
JAR 包运行后,可以对项目进行访问,以测试打包后的效果,在浏览器中访问 http://localhost:8080,如图所示。
二、打包为WAR包并运行
虽然通过 Spring Boot内嵌的Tomcat 可以将项目打成JAR包后直接运行,但每个JAR包中都会包含独立的 web 容器,对服务器的使用消耗会比较大。当想要在一个 Web容器中运行多个项目时,可以把每个项目打包成一个WAR包,然后部署到Web容器中运行下面以打包demo_test1项目为例,将Spring Boot项目打包为WAR 包并运行,具体操作如下。
1.打包为可执行的 WAR 包
(1)声明打包方式为war
默认情况下创建的 Spring Boot 项目打包方式为jar,要将项目打包为WAR包,需要在项目的pom.xml文件中声明当前项目的打包方式为war。打开demo_test1项目的 pom.xml文件,使用<packaging>标签声明项目打包方式为 war,如图。
(2)排除内置 Tomcat
Spring Boot 为项目提供了内嵌的 Tomcat 服务器,使用外部的 Tomcat 时,需要在 pom.xml文件中排除内置的Tomcat,具体代码如下。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
在上述代码中,在spring-boot-starter-web的依赖中使用<exclusion>标签声明排除该启
动器中的 Tomcat。
(3)添加Tomcat 依赖
排除内置的Tomcat后,需要在 pom.xml文件中手动添加 Tomcat的依赖,以便在后续开发中使用对应的 API,具体代码如下。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!--仅在编译和测试阶段使用,不会被打包到war包中-->
<scope>provided</scope>
</dependency>
在上述代码中添加了 Tomcat 的依赖,由于对应 Tomcat 的依赖只需在编译和测试阶段使用,所以使用<scope>标签将该依赖的作用范围指定在编译和测试阶段,避免打包时将对应的依赖打包到 WAR 包中。
(4)添加插件
在项目的 pom.xml 文件中定义打包插件,以及项目打包后包的名称具体代码如下。
<build>
<finalName>demo_test1_war</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
</plugin>
</plugins>
</build>
在上述代码中,使用<finalName>标签用于指定项目打包后的名称;<plugin>标签用于指定打包插件。
(5)修改 Spring Boot启动类
Spring Boot启动项目的方式有很多种,使用外置 Tomcat时,默认启动类需要继承 SpringBootServletInitializer 类,并重写configure()方法。SpringBooServletInitializer 执行时,会通过重写的 confgure()方法中的 SpringApplicationBuilder 实例构建并封装 SpringApplication 对象,并最终调用SpringApplication的run()方法进行项目的启动。修改后的 Spring Boot 启动类如下面代码所示。
package com.merlin.demo_test1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@ServletComponentScan // 开启基于注解方式的Servlet组件扫描支持
@SpringBootApplication
public class DemoTest1Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(DemoTest1Application.class);
}
public static void main(String[] args) {
SpringApplication.run(DemoTest1Application.class, args);
}
}
在上述代码中,启动类 DemoTest1Application继承SpringBootServletInitializer 类并重写configure()方法,在confgure()方法中,sources(DemoTest1Application.class)方法的参数必须是项目主程序的启动类。需要说明的是,为Spring Boot提供启动的Servlet 初始化器 SpringBootServletInitializer 时,典型的做法就是让主程序启动类继承 SpringBootServletInitializer 类并实现 confgure()方法;除此之外,还可以在项目中单独提供一个继承 SpringBootServletInitializer 的子类,并实现 confgure()方法。
至此,将项目打包为WAR包的准备工作已经完成,下面参照之前使用Maven工具栏中的命令打包项目的过程,将项目进行打包,打包后的结果如图所示。
从上图可以看出,控制台输出“BUILD SUCCESS”等信息,并且在项目的target 文件夹下创建了项目名称为demo_test1_war的WAR包,说明成功将项目打包为可执行 WAR 包。
解决方法:在src/main/webapp/WEB-INF/目录下创建一个简单的web.xml文件,内容可以是最小化的配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> </beans>
然后clean后再package打包一次即可。
2.运行 WAR 包
将打包好的 WAR包复制到本地Tomcat安装目录下的webapps文件夹中,在cmd窗口中执行 Tomcat 安装目录下 bin 目录中的 startup.bat 命令启动 Tomcat。Tomcat 启动后,执行效果如图所示。
从上图可以看出,Tomcat启动成功。Tomcat启动时会自动解压Tomcat安装目录下的 webapps 文件夹中的 WAR 包,并部署在Tomcat中,此时可以对项目进行访问。需要说明的是,对这种使用外部Tomcat 部署的项目进行访问时,必须加上项目名称,即打包成WAR 包后的项目全名,例如访问demo_test1_war项目映射路径为根目录,其对应的请求地址为“http://http://localhost:8080/demo_test1_war/”,在浏览器中的访问效果如下图所示。
从上图可以得出,将打包的 WAR 包部署到外部Tomcat后,可以正常对项目的资源进行访问。
需要注意的是,Spring Boot 2.7.6默认内嵌 Tomcat 的版本为9.0.69,将指定版本的 Spring Boot 项目以 WAR 包形式部署到外部Tomcat 中时,应尽量使用与 Spring Boot 项目匹配的Tomcat 版本进行项目部署,否则在部署过程中可能出现异常。
平台声明:以上文章转载于《CSDN》,文章全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,仅作参考。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Merlin5815/article/details/146197947