SpringBoot(三)之打包方式

SpringBoot(三)之打包方式

Spring Boot 提供了几种常见的打包方式,具体取决于你的项目需求和偏好:

  1. JAR(可执行的JAR文件): 这是 Spring Boot 的默认打包方式。它将项目的所有依赖打包到一个可执行的 JAR 文件中,包括 Spring Boot 应用程序以及嵌入的 Tomcat 或 Jetty 等服务器。你可以通过运行 java -jar your-application.jar 来启动应用程序。
  2. WAR(Web应用程序存档): 如果你需要将 Spring Boot 应用程序部署到外部的 Servlet 容器(如 Tomcat、Jetty 或者 Wildfly),你可以打包为 WAR 文件。在这种情况下,Spring Boot 应用程序不会包含嵌入式的服务器,而是依赖于外部容器来运行。
  3. Executable WAR(可执行的WAR文件): 从 Spring Boot 1.4 版本开始,你可以创建一个可执行的 WAR 文件。这种方式结合了 JAR 和 WAR 的优点。它允许你在外部容器中部署 Spring Boot 应用程序,并且仍然可以像运行 JAR 文件一样启动它。你只需要将 WAR 文件部署到 Servlet 容器中即可。
  4. Executable JAR with Dependencies(带依赖的可执行JAR文件): 有时你可能希望生成一个包含所有依赖的可执行 JAR 文件,而不是将依赖打包到 JAR 文件中。你可以使用 Maven 或 Gradle 插件来实现这一点,例如 Spring Boot Maven 插件或 Spring Boot Gradle 插件。这种方式生成的 JAR 文件会比较大,但可以更容易地与其他项目共享依赖。

以上是一些常见的 Spring Boot 打包方式,你可以根据项目需求选择适合你的方式。

一、jar包形式

  1. 在 Maven 项目的 pom.xml 文件中,确保你有 spring-boot-starter-parent 作为父项目,并且添加了 spring-boot-maven-plugin 插件。
<project><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.2</version></parent><dependencies><!-- 你的其他依赖 --></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
  1. 执行mvn clean package,这将在项目的 target 文件夹下生成一个可执行的 JAR 文件。

tips:可跳过tests执行 mvn clean package -DskipTests

  1. cd target 目录下,执行java -jar 生成的jar包命令运行web项目
 java -jar .\spring-boot-start-0.0.1-SNAPSHOT.jar
  .   ____          _            __ _ _/\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/  ___)| |_)| | | | | || (_| |  ) ) ) )'  |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot ::                (v2.6.4)2024-05-15 11:00:26.009  INFO 19712 --- [           main] c.a.s.SpringBootStartApplication         : Starting SpringBootStartApplication v0.0.1-SNAPSHOT using Java 1.8.0_261 on DESKTOP-SQBHU59 with PID 19712 (D:\practise\spring-all\spring-boot-start\target\spring-boot-start-0.0.1-SNAPSHOT.jar started by aoxiaojun in D:\practise\spring-all\spring-boot-start\target)
2024-05-15 11:00:26.011  INFO 19712 --- [           main] c.a.s.SpringBootStartApplication         : No active profile set, falling back to 1 default profile: "default"
2024-05-15 11:00:27.095  INFO 19712 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 1010 (http)
2024-05-15 11:00:27.106  INFO 19712 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2024-05-15 11:00:27.106  INFO 19712 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.58]
2024-05-15 11:00:27.156  INFO 19712 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2024-05-15 11:00:27.157  INFO 19712 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1105 ms
2024-05-15 11:00:27.198  INFO 19712 --- [           main] f.a.AutowiredAnnotationBeanPostProcessor : Autowired annotation should only be used on methods with parameters: public java.lang.String cn.axj.springbootstart.controller.TestController.test()
2024-05-15 11:00:27.447  INFO 19712 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 1010 (http) with context path ''
2024-05-15 11:00:27.453  INFO 19712 --- [           main] c.a.s.SpringBootStartApplication         : Started SpringBootStartApplication in 1.761 seconds (JVM running for 2.13)

二、war包

对于那种项目需要经常更新某个文件的情况,可以将springboot项目打包成war包,便于更新某些文件,而不用打整包的形式上线。打成war后需要依赖外部的serlvet容器运行,如tomcat,jetty等。

  1. 修改启动类: 需要修改 Spring Boot 应用程序的启动类,以扩展 SpringBootServletInitializer 类,并覆盖 configure 方法。这个类负责初始化 Servlet 容器,并加载 Spring 应用程序上下文。
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;public class ServletInitializer extends SpringBootServletInitializer {@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {return application.sources(YourSpringBootApplication.class);}}
  1. 修改maven配置
<packaging>war</packaging>
<dependencies><!-- 排除内嵌的容器依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope></dependency>
</dependencies>
  1. 执行mvn clean package
  2. 部署 WAR 文件: 构建成功后,WAR 文件会生成在目标文件夹下(通常是 target 目录),你可以将生成的 WAR 文件部署到外部的 Servlet 容器中。

三、Executable WAR

可执行的war包,可以通过java -jar命令直接运行,也可以在外部容器中部署和运行

  1. 在 Maven 项目的 pom.xml 文件中,确保你有 spring-boot-starter-parent 作为父项目,并且添加了 spring-boot-maven-plugin 插件。同时,将 <executable> 设置为 true
<packaging>war</packaging>
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><executable>true</executable></configuration></plugin></plugins>
</build>
  1. 执行 mvn clean package
  2. 在可以通过java -jar 命令执行war文件。
 java -jar .\target\spring-boot-start-0.0.1-SNAPSHOT.war

四、Executable JAR with Dependencies(基本不用)

Spring Boot 的可执行 JAR 文件和带依赖的可执行 JAR 文件之间有一些区别:

  1. 可执行 JAR 文件: Spring Boot 的可执行 JAR 文件是指将应用程序本身和其依赖的库(例如 Spring Boot 框架、第三方库等)打包到一个独立的 JAR 文件中。这个 JAR 文件包含了所有需要的类文件和资源文件,以及一个 MANIFEST.MF 文件,指定了应用程序的入口点。你可以通过运行 java -jar your-application.jar 来启动应用程序。
  2. 带依赖的可执行 JAR 文件: 带依赖的可执行 JAR 文件是指将应用程序本身以及其依赖的所有库打包到一个 JAR 文件中。不同之处在于,带依赖的 JAR 文件会将所有依赖的库直接包含在 JAR 文件中,而不是像普通的可执行 JAR 文件那样仅包含应用程序本身的类和资源。这意味着生成的 JAR 文件会更大,因为它包含了所有依赖的库。这种方式使得 JAR 文件更加独立,可以更容易地与其他项目共享,并且无需依赖外部的库。

总的来说,带依赖的可执行 JAR 文件包含了应用程序本身和所有依赖的库,而普通的可执行 JAR 文件只包含了应用程序本身。选择哪种方式取决于你的项目需求和偏好,如果你希望生成一个独立的、包含所有依赖的 JAR 文件,可以选择带依赖的可执行 JAR 文件;如果你希望生成一个轻量级的 JAR 文件,并且不包含依赖的库,可以选择普通的可执行 JAR 文件。

要配置生成带有依赖的可执行 JAR 文件,你可以使用 Maven Assembly 插件或 Maven Shade 插件。以下是详细的配置步骤:

使用 Maven Assembly 插件:

  1. 在 Maven 项目的 pom.xml 文件中,添加 Maven Assembly 插件,并配置以生成带有依赖的可执行 JAR 文件。
<build><plugins><plugin><artifactId>maven-assembly-plugin</artifactId><version>3.3.0</version><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><archive><manifest><!--							主类全限定名称--><mainClass>com.example.MainClass</mainClass></manifest></archive></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins>
</build>
  1. mainClass 元素中指定主类的完全限定名,这是可执行 JAR 文件的入口点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/12639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3D 生成重建009-DreamGaussian使用gaussian splatting在两分钟内生成3d

3D 生成重建009-DreamGaussian使用gaussian splatting在两分钟内生成3d 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 DreamGaussian是第一个使用gaussian splatting方法进行3d生成的工作。论文最先使用gaussian splatting替代原来用nerf表示3d。整体架构依然保留了原来的…

Jackson XML

Jackson XML 1 添加依赖2 XML转对象3 对象转XML4 根据路径读取 1 添加依赖 <dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId><version>2.11.3</version> </de…

在Spring的try-catch块中手动实现事务回滚

在Spring应用开发中&#xff0c;Transactional注解为我们提供了强大的声明式事务管理能力&#xff0c;使得我们能够专注于业务逻辑而无需过多关注底层的事务处理细节。然而&#xff0c;在某些特定场景下&#xff0c;开发者可能需要在捕获到特定异常时手动控制事务的回滚行为。本…

VMware Workstation Pro 和 Fusion Pro 针对个人用户使用免费了

今早看到 VMware by Broadcom 官方博客 VMware Desktop Hypervisor Pro Apps Now Available for Personal Use - VMware Cloud Foundation (VCF) Blog 以及 Learn more about VMware Desktop Hypervisor Products Subscription Model 总结如下&#xff1a; 免费 Player 版本将…

python中sys和os简单样例说明

目录 一、sys模块及简单样例 1.1 访问命令行参数&#xff1a; 1.2 退出程序&#xff1a; 1.3 获取Python 解释器的版本信息 1.4 设置递归深度限制及修改默认的编码&#xff1a; 二、os模块及简单样例 2.1 获取当前工作目录&#xff1a; 2.2 更改工作目录&#xff1a; 2…

VBA 引用从SQL数据库取数据的几个方法

首先&#xff0c;要定义连接的数据集 Set objRec CreateObject("ADODB.Recordset")Set objConn CreateObject("ADODB.Connection")然后在代码中要定义SQL语句&#xff0c;以便获取数据 sqlstr sqlstr " select t1.FBillNo ,t_Item.fname type,t1…

OpenAI 重磅发布GPT 4o!可以视频聊天的AI?

OpenAI 重磅发布GPT 4o&#xff01; 前言 就在今日&#xff0c;OpenAI发布了ChatGPT-4o版本&#xff0c;技术主管 Mira Murati 在直播中表示GPT-4o对比之前版本速度更快&#xff0c;在文本、视频和音频方面的能力也都有所提高。值得注意的是它还可以让用户与 ChatGPT 进行视频聊…

通电即用,极简运维:带您10分钟零配置启动超大型园区网络

为顺应数字经济发展潮流&#xff0c;越来越多企业选择云网融合&#xff0c;这给企业园区的运维人员&#xff0c;特别是中大型企业园区的运维人员带来新的挑战&#xff1a;随着企业规模扩大&#xff0c;系统和应用程序的复杂性也在增加&#xff0c;运维人员需要不断学习新技术&a…

多维 HighChart

showHighChart.html <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><!-- js脚本都是官方的,后两个是highchart脚本 --><script type"text/javascript" src"jquery1.7.1.min.js"&g…

天锐绿盾和bitlocker有啥区别?

#绿盾文档加密系统# 天锐绿盾和BitLocker是两种不同的数据加密解决方案&#xff0c;它们各自有不同的重点和应用场景&#xff0c;以下是它们之间的主要区别&#xff1a; PC地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 移动…

Markdown 高级表格控制 ∈ Markdown 使用笔记

文章目录 Part.I IntroductionPart.II 表格样式控制Chap.I 对齐方式Chap.II 表格中文本控制Chap.III 单元格合并Chap.IV 颜色控制 Part.III 实用技巧Chap.I Excel 转 HTML Reference Part.I Introduction 本文是 Markdown 使用笔记 的子博客&#xff0c;将介绍如何优雅地使用 …

信道分配(C++)

#include <iostream> #include <sstream> #include <vector> #include <algorithm> using namespace std;//每个信道只能分配给一个用户 //一个用户可以分配多个信道int get_count(vector<int> pre, vector<int> arr, int n){int count 0…

go面向对象-匿名字段

接口 go支持只提供类型而不写字段名的方式&#xff0c;也就是匿名字段&#xff0c;也称为嵌入字段 package mainimport "fmt"// go支持只提供类型而不写字段名的方式&#xff0c;也就是匿名字段&#xff0c;也称为嵌入字段//人 type Person struct {name stri…

寒冷地区污水处理一体化设备如何选型

在寒冷地区选择污水处理一体化设备时&#xff0c;需要特别考虑设备的耐寒性能和处理效率&#xff0c;以确保在低温环境下仍能稳定运行并达到预期的处理效果。以下是一些选型时需要考虑的关键因素&#xff1a; 耐寒设计&#xff1a;选择具有耐寒设计的设备&#xff0c;例如&…

[AWS] stepfunctions-local

本质是本地docker&#xff0c;只支持异步调用 run aws-stepfunctions-local docker run -p 8083:8083 \ --mount typebind,readonly,source/path/MockConfigFile.json,destination/home/StepFunctionsLocal/MockConfigFile.json \ -e SFN_MOCK_CONFIG"/home/StepFuncti…

企业微信推送报错40056

企业微信推送&#xff0c;报错 {"errCode":40056,"message":"weixin qy api errcode : 40056","result":99} 原因&#xff1a; 研究院的项目是新开的&#xff0c;虽然用的端华的配置信息&#xff0c;但应用没有授权&#xff0c;导致该…

论:即时战略RTS游戏的小地图采用 自下而上的汇报式 还是 自上而下的查找式?

关键词&#xff1a;RTS 小地图 游戏设计 思路 卫星 位置映射 阵营 更新 汇报 询问 UE4 UE5 Unreal Engine 前言 你是否想过类似红色警戒的战略小地图的要素是采用何种方式更新数据的。大量数据实时更新&#xff0c;考虑频率&#xff0c;运行效率&#xff0c;开发中如何选型&a…

SysML需求图的七种关系

SysML&#xff08;系统建模语言&#xff09;中的需求图定义了七种主要的关系来描述需求之间的关联。这些关系帮助构建了需求的逻辑框架&#xff0c;提供了需求管理的系统性方法。以下是这七种关系的简要描述&#xff1a; 包含&#xff08;Containment&#xff09;&#xff1a;…

MATLAB中的数据类型主要包括数值类型、逻辑类型、字符型、函数句柄、结构体和单元数组类型

文章目录 数值类型逻辑类型字符串字符串的构造 函数句柄结构体类型数组类型单元数组map容器 MATLAB中的数据类型主要包括数值类型、逻辑类型、字符型、函数句柄、结构体和单元数组类型。 数值类型 数值类型主要有整数、单精度浮点数和双精度浮点数。对于运算结果的整数类型溢出…

111111111111111111

11111111111111111111111111111