Spring Boot CLI 是一个命令行工具,如果您想快速开发 Spring 应用程序,可以使用它. 它使您可以运行 Groovy 脚本,这意味着您具有类似 Java 的熟悉语法,而没有太多样板代码. 您还可以引导一个新项目或为其编写自己的命令.

1. 安装 CLI

可以使用 SDKMAN 手动安装 Spring Boot CLI(命令行界面) (SDK Manager) 或使用 Homebrew 或 MacPorts (如果您是 OSX 用户) . 有关全面的安装说明,请参见 “Getting started” 部分中的 getting-started.html .

2. 使用 CLI

安装 CLI 后,可以通过输入 spring 并在命令行中按 Enter 来运行它. 如果您不带任何参数运行 spring,则会显示一个简单的帮助屏幕,如下所示:

$ spring
usage: spring [--help] [--version]
       <command> [<args>]

Available commands are:

  run [options] <files> [--] [args]
    Run a spring groovy script

  _... more command help is shown here_

您可以输入 spring help 以获取有关任何受支持命令的更多详细信息,如以下示例所示:

$ spring help run
spring run - Run a spring groovy script

usage: spring run [options] <files> [--] [args]

Option                     Description
------                     -----------
--autoconfigure [Boolean]  Add autoconfigure compiler
                             transformations (default: true)
--classpath, -cp           Additional classpath entries
--no-guess-dependencies    Do not attempt to guess dependencies
--no-guess-imports         Do not attempt to guess imports
-q, --quiet                Quiet logging
-v, --verbose              Verbose logging of dependency
                             resolution
--watch                    Watch the specified file for changes

version 命令提供了一种快速的方法来检查您使用的 Spring Boot 版本,如下所示:

$ spring version
Spring CLI v2.6.11

2.1. 使用 CLI 运行应用程序

您可以使用 run 命令来编译和运行 Groovy 源代码. Spring Boot CLI 是完全独立的,因此您不需要任何外部 Groovy 安装.

以下示例显示了用 Groovy 编写的 “hello world” Web应用程序:

hello.groovy
@RestController
class WebApplication {

    @RequestMapping("/")
    String home() {
        "Hello World!"
    }

}

要编译并运行该应用程序,请输入以下命令:

$ spring run hello.groovy

要将命令行参数传递给应用程序,请使用 -- 将命令与 “spring” 命令参数分开,如以下示例所示:

$ spring run hello.groovy -- --server.port=9000

要设置 JVM 命令行参数,可以使用 JAVA_OPTS 环境变量,如以下示例所示:

$ JAVA_OPTS=-Xmx1024m spring run hello.groovy
在 Microsoft Windows 上设置 JAVA_OPTS 时,请确保引用整个指令,例如 set "JAVA_OPTS=-Xms256m -Xmx2048m". 这样做可以确保将值正确传递给流程.

2.1.1. 推测 “grab” 依赖

标准 Groovy 包含一个 @Grab 注解,它使您可以声明对第三方库的依赖. Groovy 可以使用这种有用的技术以与 Maven 或 Gradle 相同的方式下载 jar,而无需使用构建工具.

Spring Boot 进一步扩展了该技术,并尝试根据您的代码推断出哪些库可以"`grab`" . 例如,由于先前显示的 WebApplication 代码使用 @RestController 注解,因此 Spring Boot 会获取 "Tomcat" 和 "Spring MVC".

以下各项用作 “grab hints”:

Items Grabs

JdbcTemplate, NamedParameterJdbcTemplate, DataSource

JDBC 应用程序.

@EnableJms

JMS Application.

@EnableCaching

Caching 抽象.

@Test

JUnit.

@EnableRabbit

RabbitMQ.

extends Specification

Spock 测试.

@EnableBatchProcessing

Spring 批处理.

@MessageEndpoint @EnableIntegration

Spring 集成.

@Controller @RestController @EnableWebMvc

Spring MVC + 嵌入式 Tomcat.

@EnableWebSecurity

Spring Security.

@EnableTransactionManagement

Spring 事务管理.

请参阅 Spring Boot CLI 源代码中的 CompilerAutoConfiguration 的子类,以确切地了解如何应用定制.

2.1.2. 推测 “grab” 坐标

Spring Boot 通过允许您指定不带组或版本的依赖(例如, @Grab('freemarker')) 来扩展 Groovy 的标准 @Grab 支持. 这样做可以参考 Spring Boot 的默认依赖元数据来推断 artifacts 的组和版本.

默认元数据与您使用的 CLI 版本相关. 仅当您移至新版本的 CLI 时,它才会更改,从而使您可以控制依赖的版本何时更改. 可以在 附录中找到一个表格,其中显示了默认元数据中包含的依赖及其版本.

2.1.3. 默认导入语句

为了帮助减少 Groovy 代码的大小,将自动包含几个 import 语句. 请注意,前面的示例如何引用 @Component, @RestController, 和 @RequestMapping,而无需使用完全限定的名称或 import 语句.

许多 Spring 注解无需使用 import 语句即可工作. 在添加导入之前,请尝试运行您的应用程序以查看失败的原因.

2.1.4. 自动创建 Main 方法

与等效的 Java 应用程序不同,您不需要在 Groovy 脚本中包含 public static void main(String[] args) 方法. SpringApplication 是自动创建的,其中已编译的代码作为 source.

2.1.5. 自定义依赖管理

默认情况下,在解决 @Grab 依赖时,CLI 使用 spring-boot-dependencies 中声明的依赖管理. 可以使用 @DependencyManagementBom 注解 来配置其他依赖管理,这些依赖管理将覆盖默认的依赖管理. 注解的值应指定一个或多个Maven BOM的坐标 (groupId:artifactId:version) .

例如,考虑以下声明:

@DependencyManagementBom("com.example.custom-bom:1.0.0")

前面的声明在 com/example/custom-versions/1.0.0/ 下的 Maven 仓库中选择了 custom-bom-1.0.0.pom .

指定多个 BOM 时,它们以声明它们的顺序应用,如下例所示:

@DependencyManagementBom([
    "com.example.custom-bom:1.0.0",
    "com.example.another-bom:1.0.0"])

前面的示例表明, another-bom 中的依赖管理会覆盖 custom-bom 中的依赖管理.

您可以在可以使用 @Grab 的任何地方使用 @DependencyManagementBom. 但是,为了确保依赖性管理的顺序一致,您可以在应用程序中最多使用一次 @DependencyManagementBom.

2.2. 具有多个源文件的应用程序

您可以对所有接受文件输入的命令使用 “shell globbing” . 这样可以使您从单个目录使用多个文件,如以下示例所示:

$ spring run *.groovy

2.3. 打包你的应用程序

您可以使用 jar 命令将应用程序打包到一个独立的可执行 jar 文件中,如以下示例所示:

$ spring jar my-app.jar *.groovy

生成的 jar 包含通过编译应用程序产生的类以及应用程序的所有依赖,以便随后可以使用 java -jar 来运行它. jar 文件还包含来自应用程序的类路径的条目. 您可以使用 --include--exclude 添加和删除 jar 的显式路径. 两者都用逗号分隔,并且都接受前缀 “+” 和 “-” 形式,以表示应将其从默认值中删除. 默认包括以下内容:

public/**, resources/**, static/**, templates/**, META-INF/**, *

默认排除项如下:

.*, repository/**, build/**, target/**, **/*.jar, **/*.groovy

在命令行上输入 spring help jar 以获取更多信息.

2.4. 初始化新项目

使用 init 命令,可以使用 start.spring.io 创建新项目,而无需离开 shell,如以下示例所示:

$ spring init --dependencies=web,data-jpa my-project
Using service at https://start.spring.io
Project extracted to '/Users/developer/example/my-project'

前面的示例使用 my-project 目录创建一个基于 Maven 的项目,该项目使用 spring-boot-starter-webspring-boot-starter-data-jpa. 您可以使用 --list 标志列出服务的功能,如以下示例所示:

$ spring init --list
=======================================
Capabilities of https://start.spring.io
=======================================

Available dependencies:
-----------------------
actuator - Actuator: Production ready features to help you monitor and manage your application
...
web - Web: Support for full-stack web development, including Tomcat and spring-webmvc
websocket - Websocket: Support for WebSocket development
ws - WS: Support for Spring Web Services

Available project types:
------------------------
gradle-build -  Gradle Config [format:build, build:gradle]
gradle-project -  Gradle Project [format:project, build:gradle]
maven-build -  Maven POM [format:build, build:maven]
maven-project -  Maven Project [format:project, build:maven] (default)

...

init 命令支持许多选项. 请参阅 help 输出以获取更多详细信息. 例如,以下命令创建一个使用 Java 8 和 war 打包的 Gradle 项目:

$ spring init --build=gradle --java-version=1.8 --dependencies=websocket --packaging=war sample-app.zip
Using service at https://start.spring.io
Content saved to 'sample-app.zip'

2.5. 使用嵌入式 Shell

Spring Boot 包含用于 BASH 和 zsh Shell 的命令行完成脚本. 如果您不使用这两个 shell 程序(也许您是 Windows 用户) ,则可以使用 shell 命令启动集成 shell 程序,如以下示例所示:

$ spring shell
Spring Boot (v2.6.11)
Hit TAB to complete. Type \'help' and hit RETURN for help, and \'exit' to quit.

在内部使用嵌入式 shell 程序,您可以直接运行其他命令:

$ version
Spring CLI v2.6.11

嵌入式 shell 支持 ANSI 颜色输出以及 tab 补全. 如果需要运行本地命令,则可以使用 ! 字首. 要退出嵌入式外壳,请按 ctrl-c.

2.6. 添加 CLI 扩展

您可以使用 install 命令将扩展添加到 CLI. 该命令采用格式为 group:artifact:version 的一组或多组 artifacts 坐标,如以下示例所示:

$ spring install com.example:spring-boot-cli-extension:1.0.0.RELEASE

除了安装由您提供的坐标标识的 artifacts 之外,还将安装所有 artifacts 的依赖.

要卸载依赖,请使用 uninstall 命令. 与 install 命令一样,它以 group:artifact:version 的格式获取一组或多组 artifacts 坐标,如以下示例所示:

$ spring uninstall com.example:spring-boot-cli-extension:1.0.0.RELEASE

它将卸载由您提供的坐标及其依赖标识的 artifacts .

要卸载所有其他依赖,可以使用 --all 选项,如以下示例所示:

$ spring uninstall --all

3. 使用 Groovy Beans DSL 开发应用程序

Spring Framework 4.0 对 beans{} “DSL”(从 Grails 来) 具有本地支持,并且您可以使用相同的格式将 bean 定义嵌入 Groovy 应用程序脚本中. 有时这是包括外部功能(如中间件声明) 的好方法,如以下示例所示:

@Configuration(proxyBeanMethods = false)
class Application implements CommandLineRunner {

    @Autowired
    SharedService service

    @Override
    void run(String... args) {
        println service.message
    }

}

import my.company.SharedService

beans {
    service(SharedService) {
        message = "Hello World"
    }
}

您可以将类声明与 beans{} 混合在同一文件中,只要它们位于顶层即可; 或者,如果愿意,可以将 bean DSL 放在单独的文件中.

4. 使用 settings.xml 配置 CLI

Spring Boot CLI 使用 Maven 的依赖解析引擎 Aether 来解决依赖. CLI使用 ~/.m2/settings.xml 中的 Maven 配置来配置 Aether. CLI 遵循以下配置设置:

  • Offline

  • Mirrors

  • Servers

  • Proxies

  • Profiles

    • Activation

    • Repositories

  • Active profiles

有关更多信息,请参见 Maven 的设置文档.

5. 下一步

GitHub 仓库中提供了一些 示例 groovy 脚本,您可以使用它们来试用 Spring Boot CLI. 在整个 源代码中也有大量的 Javadoc.

如果发现达到了 CLI 工具的极限,则可能需要考虑将应用程序转换为完整的 Gradle 或 Maven 构建的 "Groovy项目". 下一部分将介绍 Spring Boot 的 "构建工具插件",您可以将其与 Gradle 或 Maven 一起使用.