Skip to content

15. Spring Boot CLI

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

15.1. 安装 CLI

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

15.2. 使用 CLI

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

shell
$ 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 以获取有关任何受支持命令的更多详细信息,如以下示例所示:

shell
$ 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 版本,如下所示:

shell
$ spring version
Spring CLI v2.6.11

15.2.1. 使用 CLI 运行应用程序

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

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

hello.groovy

groovy
@RestController
class WebApplication {

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

}

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

shell
$ spring run hello.groovy

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

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

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

shell
$ JAVA_OPTS=-Xmx1024m spring run hello.groovy

TIP

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

推测 “grab” 依赖

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

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

以下各项用作 “grab hints”:

ItemsGrabs
JdbcTemplateNamedParameterJdbcTemplateDataSourceJDBC 应用程序.
@EnableJmsJMS Application.
@EnableCachingCaching 抽象.
@TestJUnit.
@EnableRabbitRabbitMQ.
extends SpecificationSpock 测试.
@EnableBatchProcessingSpring 批处理.
@MessageEndpoint @EnableIntegrationSpring 集成.
@Controller @RestController @EnableWebMvcSpring MVC + 嵌入式 Tomcat.
@EnableWebSecuritySpring Security.
@EnableTransactionManagementSpring 事务管理.

TIP

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

推测 “grab” 坐标

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

TIP

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

默认导入语句

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

TIP

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

自动创建 Main 方法

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

自定义依赖管理

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

例如,考虑以下声明:

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

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

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

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

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

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

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

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

shell
$ spring run *.groovy

15.2.3. 打包你的应用程序

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

shell
$ 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 以获取更多信息.

15.2.4. 初始化新项目

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

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-web 和 spring-boot-starter-data-jpa. 您可以使用 --list 标志列出服务的功能,如以下示例所示:

shell
$ 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 项目:

shell
$ 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'

15.2.5. 使用嵌入式 Shell

Spring Boot 包含用于 BASH 和 zsh Shell 的命令行完成脚本. 如果您不使用这两个 shell 程序(也许您是 Windows 用户) ,则可以使用 shell 命令启动集成 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 程序,您可以直接运行其他命令:

shell
$ version
Spring CLI v2.6.11

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

15.2.6. 添加 CLI 扩展

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

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

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

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

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

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

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

shell
$ spring uninstall --all

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

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

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

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

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

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

15.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 的设置文档.

15.5. 下一步

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

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