Spring Boot2.3 新特性分层JAR的使用

文章标题:SpringBoot2.3新特性分层JAR的使用

一、前言

在 2.3 版本发布之后,SpringBoot 推出了一个新特性——分层 JAR(Layered JAR)。本文将详细介绍分层 JAR 的概念,用法和示例。

二、概念

在过去,当你用 SpringBoot 来打包应用程序时所得到的 JAR 文件中包含了所有的类,依赖和资源。虽然这种方式简单易用,但是当我们需要在 Kubernetes 或 Docker 等环境下运行的时候,却需要承受一些额外的负担。比如在获取容器镜像的时候,需要下载整个 JAR 文件,这样可能会影响启动速度。

为了解决这个问题,SpringBoot 推出了一个新特性——分层 JAR。所谓分层,就是将 JAR 文件进行拆分,划分为独立的层,每一层都包含不同类型的资源。

三、用法

SpringBoot 官方文档上有一句话:“生产环境中的分层 JAR 定制通常是在 Maven 或 Gradle 里配置 plugin 来完成的”。从这句话可以看出,我们需要使用插件来生成分层 JAR。

  1. 修改 Maven 配置文件 pom.xml
<project>
  ...

  <packaging>jar</packaging>

  <dependencies>
    ...
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>repackage</goal>
            </goals>
            <configuration>
              <repackage>
                <classifier>exec</classifier>
                <enabled>true</enabled>
                <layers>
                  <enabled>true</enabled>
                </layers>
              </repackage>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

</project>

修改 pom.xml 文件后,在命令行中输入 mvn clean install 运行 Maven 命令就可以生成打包文件。

  1. 查看生成的分层 JAR

生成的分层 JAR 文件名称为 *-exec.jar,可以通过 jar -tf 命令查看文件内容。

$ jar -tf target/demo-0.0.1-SNAPSHOT-exec.jar

# 输出结果:
org/
org/springframework/
org/springframework/boot/
...
spring-boot-loader/
spring-boot-loader/...
demo-0.0.1-SNAPSHOT.jar
xanadu/
xanadu/altium/
xanadu/altium/demo/
xanadu/altium/demo/service/
xanadu/altium/demo/service/DemoService.class

通过上述命令可以看出,生成的分层 JAR 文件包含两层。demo-0.0.1-SNAPSHOT.jar 包含了应用的所有类和资源(第一层),spring-boot-loader 包含了 SpringBoot 启动类和其他资源(第二层)。

四、示例

下面,我们通过两个简单的示例来演示分层 JAR 的使用。

示例 1:生成 Docker 镜像

需求: 我们需要将 SpringBoot 应用打包成 Docker 镜像,并在 Kubernetes 上运行。

步骤: 下面是打包 Docker 镜像的步骤:

1. 生成分层 JAR

$ mvn clean install

2. 编写 Dockerfile

FROM openjdk:8-jdK-alpine

MAINTAINER me@abc.com

COPY target/demo-0.0.1-SNAPSHOT-exec.jar /app.jar

CMD ["java", "-jar", "/app.jar"]

3. 构建 Docker 镜像

$ docker build -t demo:latest .

4. 运行镜像

$ docker run -d -p 8080:8080 demo:latest

5. 验证

在浏览器中访问 http://localhost:8080 进行验证。

示例 2:应用更新

需求: 对 SpringBoot 应用进行更新后,我们需要将更新后的应用重新打包,并在运行中的容器上进行更新。

步骤: 下面是更新 SpringBoot 应用的步骤:

1. 更新应用并重新打包

2. 将 jar 包复制到运行中的容器内

$ docker cp target/demo-0.0.1-SNAPSHOT-exec.jar mycontainer:/app.jar

3. 更新容器内的应用

首先需要查看容器的 ID:

$ docker ps

然后执行下面的命令进行更新:

$ docker exec <container-id> java -jar /app.jar

4. 验证

在浏览器中访问 http://localhost:8080 进行验证。

五、结语

本文介绍了分层 JAR 的概念,用法和示例。如果你想深入了解分层 JAR,可以参考 SpringBoot 官方文档的详细说明。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot2.3 新特性分层JAR的使用 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • 如何使用Java调试器?

    当我们面对一个复杂的Java程序时,有时候我们会遇到各种错误和难以排查的bug。这时候,Java调试器就是我们排查错误的好帮手。本文将详细讲解如何使用Java调试器。 什么是Java调试器? Java调试器是用来调试Java程序的工具。调试器可以让程序在运行时停下来,让我们一步一步地检查程序状态,寻找错误。Java调试器可以帮助我们: 监视程序状态和变量值。…

    Java 2023年5月11日
    00
  • IDEA2020.2.3 “reading maven projects”卡住的问题

    问题描述: 在使用IntelliJ IDEA 2020.2.3进行Maven项目的读取时,出现了卡在”Reading Maven Projects”阶段的情况,无法继续进行下一步操作。 解决方案: 清空本地Maven仓库 首先尝试清空本地Maven仓库,步骤如下: 1)在命令行使用以下命令清空本地Maven仓库: mvn dependency:purge-l…

    Java 2023年5月20日
    00
  • Java中String判断值为null或空及地址是否相等的问题

    下面我来详细讲解一下Java中String判断值为null或空及地址是否相等的问题的攻略。 判断字符串是否为空 在Java中,判断字符串是否为空可以用以下三种方式。 1.使用length()方法 String str = ""; if (str.length() == 0) { System.out.println("字符串为空…

    Java 2023年5月27日
    00
  • JPA 使用criteria简单查询工具类方式

    JPA 使用 Criteria 简单查询工具类方式,具体步骤如下: 什么是Criteria查询 通常的JPQL查询必须要写类似于SELECT * FROM book WHERE id = 1 这样的SQL语句,书写SQL语句的时侯需要时刻注意SQL语句的拼写,如此繁琐而且费时费力,如果采用Criteria查询,则可以省去SQL语句的书写,Criteria查询…

    Java 2023年5月20日
    00
  • 基于SpringBoot项目遇到的坑–Date入参问题

    让我来详细讲解一下 “基于SpringBoot项目遇到的坑–Date入参问题” 的完整攻略。 背景 在进行 SpringBoot 开发过程中,我们经常会遇到 Date 入参的问题。比如从前端传递 Date 类型参数或者从数据库中查询出 Date 类型数据时,我们需要使用 Date 进行传递和处理。但是在具体的实现过程中,可能会遇到一些问题,比如格式不正确,…

    Java 2023年6月1日
    00
  • java实现日历功能

    下面是“Java实现日历功能”的完整攻略。 1. 需求分析 我们需要实现一个日历功能,具体需求如下: 能够显示指定年份和月份的日历; 显示的日历中包括节假日等特殊日期; 支持用户通过命令行参数指定需要显示的年份和月份。 2. 技术选型 为了实现这个需求,我们可以使用Java语言结合标准库中的java.util.Calendar和java.time.YearM…

    Java 2023年5月19日
    00
  • 详解Spring mvc的web.xml配置说明

    在Spring MVC中,web.xml文件是配置Spring MVC的重要文件之一。本文将详细讲解web.xml文件的配置说明,并提供两个示例说明。 web.xml配置说明 1. DispatcherServlet 在web.xml文件中,我们需要配置DispatcherServlet来处理Web请求和响应。下面是一个示例: <servlet>…

    Java 2023年5月18日
    00
  • java实现贪吃蛇极速版

    Java实现贪吃蛇极速版攻略 简介 贪吃蛇又称为贪食蛇,是一款经典游戏。玩家通过控制贪吃蛇在游戏界面中不断地移动,吃到食物可以增加长度,同时避免撞到自己或游戏界面的边缘。 本文将详细讲解如何使用Java语言实现一个极速版的贪吃蛇游戏,并提供两个示例说明。 游戏功能设计 贪吃蛇移动(上、下、左、右)功能 食物随机生成并在地图上展示 碰撞检测,当贪吃蛇撞到自己或…

    Java 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部