springboot打包实现项目JAR包和依赖JAR包分离

yizhihongxing

Spring Boot能够将整个应用打包到一个 JAR 文件中,同时它也支持将应用的主 JAR 包和第三方依赖包分离,以达到减小 JAR 文件大小的目的,提高应用启动速度的目的。下面是详细的攻略:

1. 配置 Maven 插件

在 Spring Boot 应用的 pom.xml 文件中,添加如下插件:

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <configuration>
        <mainClass>com.example.MyApplication</mainClass>
        <layout>JAR</layout>
        <excludes>
            <exclude>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </exclude>
        </excludes>
      </configuration>
      <executions>
        <execution>
          <goals>
            <goal>repackage</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

其中,主要配置如下:

  • mainClass 表示启动类的全限定名,该类在打包后的 JAR 包中是默认的启动类;
  • layout 配置打包方式,选择 JAR 进行打包;
  • excludes 指定需要排除的依赖,可以根据需要调整。

2. 使用 Maven 打包

在 Maven 命令行中执行:

mvn clean package

执行完成后,可以在项目的 target 目录下找到生成的 JAR 包。此时,JAR 包中已经包含了所有的依赖包。

3. 分离 JAR 包

使用如下命令,将主 JAR 包和依赖包进行分离:

jar -xf example.jar

执行该命令后,可以看到项目的根目录下增加了许多目录和文件,其中包括以下几个目录:

BOOT-INF/classess/
BOOT-INF/lib/
META-INF/

其中,BOOT-INF/classess/ 目录下存放了项目的 Java class 文件,BOOT-INF/lib/ 目录下存放了分离的依赖包,META-INF/ 目录下包含了项目的元数据信息。

可以通过如下命令,来启动应用程序:

java -cp example.jar:BOOT-INF/lib/* com.example.MyApplication

其中,:BOOT-INF/lib/* 字符串表示添加依赖包的路径为当前目录的 BOOT-INF/lib/ 目录,com.example.MyApplication 为启动类的全限定名。

示例

示例一:Spring Boot Web 应用

一个 Spring Boot 的 Web 应用,其打包和分离示例配置如下:

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <configuration>
        <mainClass>com.example.MyApplication</mainClass>
        <layout>JAR</layout>
        <excludes>
            <exclude>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </exclude>
        </excludes>
        <classifier>exec</classifier>
      </configuration>
      <executions>
        <execution>
          <goals>
            <goal>repackage</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

执行如下命令,将 JAR 包分离:

jar -xf example-exec.jar

启动应用程序:

java -cp example.jar:example-exec/BOOT-INF/lib/* com.example.MyApplication

其中,example-exec 目录为 example-exec.jar 文件解压后的目录名称。

示例二:Spring Boot 非 Web 应用

一个 Spring Boot 的非 Web 应用,其打包和分离示例配置如下:

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <configuration>
        <mainClass>com.example.MyApplication</mainClass>
        <layout>JAR</layout>
        <excludes>
            <exclude>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </exclude>
        </excludes>
        <classifier>exec</classifier>
      </configuration>
      <executions>
        <execution>
          <goals>
            <goal>repackage</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

执行如下命令,将 JAR 包分离:

jar -xf example-exec.jar

启动应用程序:

java -cp example.jar:example-exec/BOOT-INF/lib/* com.example.MyApplication

其中,example-exec 目录为 example-exec.jar 文件解压后的目录名称。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot打包实现项目JAR包和依赖JAR包分离 - Python技术站

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

相关文章

  • 详解JAVA 线程-线程的状态有哪些?它是如何工作的?

    详解JAVA 线程-线程的状态有哪些?它是如何工作的? 线程的状态 Java中的线程状态通常分为以下几种: NEW(新建):新创建了一个线程对象,但还没有调用其start()方法 RUNNABLE(可运行):运行状态。线程对象创建后,其他线程调用了该对象的start()方法,该状态的线程位于等待运行队列中,等待获取CPU的使用权 BLOCKED(阻塞):线程…

    Java 2023年5月19日
    00
  • Java运行时环境之ClassLoader类加载机制详解

    Java运行时环境之ClassLoader类加载机制详解 1. 背景 在Java程序运行过程中,Java虚拟机会将Java程序的.class字节码文件加载进内存中执行。然而,如果所有的.class文件都加载进内存,会导致内存占用过高,因此Java采用了ClassLoader类加载机制,只有在需要使用某个Class时才会动态加载进内存。本文将详细讲解Class…

    Java 2023年5月26日
    00
  • 关于spring5的那些事:@Indexed 解密

    下面是关于 “关于 Spring5 的那些事: @Indexed 解密” 的完整攻略: 标题 1. @Indexed 的作用是什么 Spring数据可访问性框架(spring-data)提供了一个注解@Indexed,用于标记一个实体类(Entity)中的属性,使其被包含在全文搜索索引(Full Text Search Index)中。在使用Elastics…

    Java 2023年5月31日
    00
  • SpringBoot中的配置类(@Configuration)

    SpringBoot中的 @Configuration 类是一个特殊的类,其作用是为Spring容器提供Bean定义,用来替代传统的XML配置文件。这样,我们就可以通过在Java中编写@Configuration类,来使得Spring容器中的Bean定义更加方便、直观。下面我将详细讲解SpringBoot中的配置类(@Configuration)。 1. @…

    Java 2023年5月15日
    00
  • 三种Web开发主流技术的性价评价

    接下来我将详细讲解三种Web开发主流技术的性价评价,希望能对您有所帮助。 一、HTML/CSS/JavaScript 性价比评价 HTML、CSS和JavaScript是Web开发中必不可少的三种技术,合称为前端技术。HTML用于网页结构的编写,CSS用于网页样式的设置,JavaScript用于网页交互和动态效果的实现。这三种技术在Web开发中有着广泛的应用…

    Java 2023年6月15日
    00
  • java配置dbcp连接池(数据库连接池)示例分享

    下面我将为您提供关于“Java配置DBCP连接池(数据库连接池)示例分享”的完整攻略: 什么是DBCP连接池 DBCP连接池是一个Java SQL连接池管理包,用于管理数据库连接的池。它使用JDBC连接接口,并管理连接,可重用连接的对象。 使用DBCP连接池的好处 DBCP连接池的好处如下: 连接池管理:可以重复使用现有的数据库连接,从而大大提高系统的性能和…

    Java 2023年5月19日
    00
  • Java中异常打印输出的常见方法总结

    当Java程序运行出现异常时,我们需要找到出现问题的原因,对于找到问题的原因和修复问题,我们通常需要查看程序的异常信息。本篇文章将会对Java中异常打印输出的常见方法进行总结,并提供一些示例用于说明。 使用try-catch语句块打印异常信息 在Java程序中使用try-catch语句块实现异常处理,我们可以利用catch代码块中的异常对象获取到异常的原因,…

    Java 2023年5月26日
    00
  • 进制转换基础

    进制转换基础 1. 什么是进制? 进制是一种数学表示法,指定了一组用于表示数值的符号或数字。在日常计算中,我们通常使用的是十进制(或者说是“阿拉伯数字”),即使用0到9这10个数字进行计数。但是在计算机中,为了存储和处理数据方便,使用的是二进制,即使用0和1这两个数字进行计数。 2. 进制转换方法 2.1 十进制转其他进制 十进制转其他进制的方法是:把十进制…

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