• 20220526 Build Tool Plugins


    前言

    文档地址

    Spring Boot 为 Maven 和 Gradle 提供了构建工具插件。这些插件提供了多种功能,包括可执行 jar 的打包。本节提供有关这两个插件的更多详细信息,以及在您需要扩展不受支持的构建系统时提供的一些帮助。如果您刚刚开始,您可能需要先阅读 using.html 部分中的 using.html

    1. Spring Boot Maven 插件

    Spring Boot Maven 插件在 Maven 中提供 Spring Boot 支持,让您可以打包可执行 jar 或 war 文件并“就地”运行应用程序。要使用它,您必须使用 Maven 3.2(或更高版本)。

    请参阅插件的文档以了解更多信息:

    2. Spring Boot Gradle 插件

    Spring Boot Gradle Plugin 在 Gradle 中提供 Spring Boot 支持,让您可以打包可执行的 jar 或 war 文件,运行 Spring Boot 应用程序,并使用 spring-boot-dependencies 提供的依赖管理。它需要 Gradle 6.8、6.9 或 7.x 。请参阅插件的文档以了解更多信息:

    3. Spring Boot AntLib Module

    Spring Boot AntLib 模块为 Apache Ant 提供基本的 Spring Boot 支持。您可以使用该模块来创建可执行的 jar。要使用该模块,您需要在您的 build.xml 中声明一个额外的 spring-boot 命名空间,如以下示例所示:

    <project xmlns:ivy="antlib:org.apache.ivy.ant"
        xmlns:spring-boot="antlib:org.springframework.boot.ant"
        name="myapp" default="build">
        ...
    </project>
    

    您需要记住使用 -lib 选项启动 Ant,如以下示例所示:

    $ ant -lib <directory containing spring-boot-antlib-2.6.7.jar>
    

    “使用 Spring Boot” 部分包含一个更完整的 通过spring-boot-antlib 使用 Apache Ant 示例

    3.1. Spring Boot Ant Tasks

    声明 spring-boot-antlib 命名空间后,可以使用以下额外的任务:

    3.1.1. Using the “exejar” Task

    您可以使用 exejar 任务来创建 Spring Boot 可执行 jar 。任务支持以下属性:

    属性 描述 是否必需
    destfile 要创建的目标 jar 文件
    classes Java 类文件的根目录
    start-class 要运行的主应用程序类 否(默认是找到的第一个声明 main 方法的类)

    以下嵌套元素可用于该任务:

    元素 描述
    resources 一个或多个 资源集合 ,描述应添加到创建的 jar 文件内容中的一组 资源
    lib 应将一个或多个 资源集合 添加到构成应用程序的运行时依赖类路径的 jar 库集合中

    3.1.2. 示例

    本节展示了 Ant 任务的两个示例。

    指定开始类

    <spring-boot:exejar destfile="target/my-application.jar"
            classes="target/classes" start-class="com.example.MyApplication">
        <resources>
            <fileset dir="src/main/resources" />
        </resources>
        <lib>
            <fileset dir="lib" />
        </lib>
    </spring-boot:exejar>
    

    检测开始类

    <exejar destfile="target/my-application.jar" classes="target/classes">
        <lib>
            <fileset dir="lib" />
        </lib>
    </exejar>
    

    3.2. 使用 “findmainclass” 任务

    exejar 在内部使用 findmainclass 任务来定位声明 main 的类。如果有必要,还可以在生成中直接使用此任务。支持以下属性:

    属性 描述 是否必需
    classesroot Java 类文件的根目录 是(除非指定 mainclass
    mainclass 可用于短路 main 类搜索
    property 应使用结果设置的 Ant 属性 否(如果未指定,将记录结果)

    3.2.1. 示例

    本节包含三个使用 findmainclass 的示例。

    查找并记录

    <findmainclass classesroot="target/classes" />
    

    查找并设置

    <findmainclass classesroot="target/classes" property="main-class" />
    

    覆盖并设置

    <findmainclass mainclass="com.example.MainClass" property="main-class" />
    

    4. 支持其他构建系统

    如果您想使用除 Maven、Gradle 或 Ant 之外的构建工具,您可能需要开发自己的插件。可执行 jar 需要遵循特定的格式,并且某些条目需要以未压缩的形式写入(有关详细信息,请参阅附录中的 可执行 jar 格式 部分)。

    Spring Boot Maven 和 Gradle 插件都使用 spring-boot-loader-tools 实际生成 jar。如果需要,可以直接使用这个库。

    4.1. 重新包装档案

    要重新打包现有存档以使其成为独立的可执行存档,请使用 org.springframework.boot.loader.tools.RepackagerRepackager 类采用单个构造函数参数,该参数引用现有的 jar 或 war 文件。使用两种可用 repackage() 方法之一来替换原始文件或写入新目标。在运行之前,还可以在重新打包器上配置各种设置。

    4.2. 嵌套库

    重新打包存档时,您可以使用 org.springframework.boot.loader.tools.Libraries 接口包含对依赖文件的引用。我们在这里不提供任何具体的实现,因为它们通常是特定于构建系统的 Libraries

    如果您的存档已经包含库,您可以使用 Libraries.NONE

    4.3. 寻找主类

    如果不使用 Repackager.setMainClass() 指定主类,则重新打包器使用 ASM 读取类文件并尝试使用 public static void main(String[] args) 方法找到合适的类。如果找到多个候选者,则会引发异常。

    4.4. 示例重新打包实现

    以下示例显示了一个典型的重新打包实现:

    import java.io.File;
    import java.io.IOException;
    import java.util.List;
    
    import org.springframework.boot.loader.tools.Library;
    import org.springframework.boot.loader.tools.LibraryCallback;
    import org.springframework.boot.loader.tools.LibraryScope;
    import org.springframework.boot.loader.tools.Repackager;
    
    public class MyBuildTool {
    
        public void build() throws IOException {
            File sourceJarFile = ...
            Repackager repackager = new Repackager(sourceJarFile);
            repackager.setBackupSource(false);
            repackager.repackage(this::getLibraries);
        }
    
        private void getLibraries(LibraryCallback callback) throws IOException {
            // Build system specific implementation, callback for each dependency
            for (File nestedJar : getCompileScopeJars()) {
                callback.library(new Library(nestedJar, LibraryScope.COMPILE));
            }
            // ...
        }
    
        private List<File> getCompileScopeJars() {
            return ...
        }
    
    }
    
  • 相关阅读:
    Numpy基本介绍
    Java中的<< 和 >> 和 >>> 详细分析
    Matplotlib绘制基本图像
    Matplotlib基本使用
    最新动态:开源项目 ionic3-awesome — 实现生成带logo二维码组件
    最新动态:开源项目 ionic3-awesome — 实现iframe嵌入外部网页
    最新动态: 开源项目 ionic3-awesome — 实现多主题功能
    Angular5强势来袭
    js中对象的拷贝,浅拷贝和深拷贝
    vue2 + element-ui + axios 开源项目推荐
  • 原文地址:https://www.cnblogs.com/huangwenjie/p/16354180.html
Copyright © 2020-2023  润新知