spring_reference/all in one/spring_boot_cli.md

287 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

### Spring Boot CLI
Spring Boot CLI是一个命令行工具如果想使用Spring进行快速开发可以使用它。它允许你运行Groovy脚本这意味着你可以使用熟悉的类Java语法并且没有那么多的模板代码。你也可以启动一个新的工程或为Spring Boot CLI编写自己的命令。
### 安装CLI
你可以手动安装Spring Boot CLI也可以使用GVMGroovy环境管理工具或HomebrewMacPorts如果你是一个OSX用户。参考"Getting started"的[Section 10.2, “Installing the Spring Boot CLI” ](http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#getting-started-installing-the-cli)可以看到全面的安装指令。
### 使用CLI
一旦安装好CLI你可以输入`spring`来运行它。如果你不使用任何参数运行`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
```
你可以使用`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
-e, --edit Open the file with the default system
editor
--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 v1.3.0.BUILD-SNAPSHOT
```
* 使用CLI运行应用
你可以使用`run`命令编译和运行Groovy源代码。Spring Boot CLI完全自包含以致于你不需要安装任何外部的Groovy。
下面是一个使用Groovy编写的"hello world" web应用
hello.grooy
```java
@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
```
- 推断"grab"依赖
标准的Groovy包含一个`@Grab`注解它允许你声明对第三方库的依赖。这项有用的技术允许Groovy以和Maven或Gradle相同的方式下载jars但不需要使用构建工具。
Spring Boot进一步延伸了该技术它会基于你的代码尝试推导你"grab"哪个库。例如由于WebApplication代码上使用了`@RestController`注解,"Tomcat"和"Spring MVC"将被获取grabbed
下面items被用作"grab hints"
|items|Grabs|
|-----|:-----|
|JdbcTemplate,NamedParameterJdbcTemplate,DataSource|JDBC应用|
|@EnableJms|JMS应用|
|@EnableCaching|Caching abstraction|
|@Test|JUnit|
|@EnableRabbit|RabbitMQ|
|@EnableReactor|Project Reactor|
|继承Specification|Spock test|
|@EnableBatchProcessing|Spring Batch|
|@MessageEndpoint,@EnableIntegrationPatterns|Spring Integration|
|@EnableDeviceResolver|Spring Mobile|
|@Controller,@RestController,@EnableWebMvc|Spring MVC + Embedded Tomcat|
|@EnableWebSecurity|Spring Security|
|@EnableTransactionManagement|Spring Transaction Management|
**注**想要理解自定义是如何生效可以查看Spring Boot CLI源码中的[CompilerAutoConfiguration](http://github.com/spring-projects/spring-boot/tree/master/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/CompilerAutoConfiguration.java)子类。
- 推断"grab"坐标
Spring Boot扩展Groovy标准"@Grab"注解使其能够允许你指定一个没有group或version的依赖例如`@Grab('freemarker')`。
artifacts的组和版本是通过查看Spring Boot的依赖元数据推断出来的。注意默认的元数据是和你使用的CLI版本绑定的只有在你迁移到一个CLI新版本时它才会改变这样当你的依赖改变时你就可以控制了。在[附录](http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#appendix-dependency-versions)的表格中可以查看默认元数据包含的依赖和它们的版本。
- 默认import语句
为了帮助你减少Groovy代码量一些`import`语句被自动包含进来了。注意上面的示例中引用`@Component``@RestController`和`@RequestMapping`而没有使用全限定名或`import`语句。
**注**很多Spring注解在不使用`import`语句的情况下可以正常工作。尝试运行你的应用看一下在添加imports之前哪些会失败。
- 自动创建main方法
跟等效的Java应用不同你不需要在Groovy脚本中添加一个`public static void main(String[] args)`方法。Spring Boot 会使用你编译后的代码自动创建一个SpringApplication。
- 自定义"grab"元数据
Spring Boot提供一个新的`@GrabMetadata`注解你可以使用它提供自定义的依赖元数据以覆盖Spring Boot的默认配置。该元数据通过使用提供一个或多个配置文件坐标的注解来指定使用一个属性标识符"type"部署到Maven仓库.。配置文件中的每个实体必须遵循`group:module=version`的格式。
例如,下面的声明:
```java
`@GrabMetadata("com.example.custom-versions:1.0.0")`
```
将会加载Maven仓库处于`com/example/custom-versions/1.0.0/`下的`custom-versions-1.0.0.properties`文件。
可以通过注解指定多个属性文件,它们会以声明的顺序被使用。例如:
```java
`@GrabMetadata(["com.example.custom-versions:1.0.0",
"com.example.more-versions:1.0.0"])`
```
意味着位于`more-versions`的属性将覆盖位于`custom-versions`的属性。
你可以在任何能够使用`@Grab`的地方使用`@GrabMetadata`,然而,为了确保元数据的顺序一致,你在应用程序中最多只能使用一次`@GrabMetadata`。[Spring IO Platform](http://platform.spring.io/)是一个非常有用的依赖元数据源(Spring Boot的超集),例如:
```java
@GrabMetadata('io.spring.platform:platform-versions:1.0.4.RELEASE')
```
* 测试你的代码
`test`命令允许你编译和运行应用程序的测试用例。常规使用方式如下:
```shell
$ spring test app.groovy tests.groovy
Total: 1, Success: 1, : Failures: 0
Passed? true
```
在这个示例中,`test.groovy`包含JUnit `@Test`方法或Spock `Specification`类。所有的普通框架注解和静态方法在不使用import导入的情况下仍旧可以使用。
下面是我们使用的`test.groovy`文件含有一个JUnit测试
```java
class ApplicationTests {
@Test
void homeSaysHello() {
assertEquals("Hello World!", new WebApplication().home())
}
}
```
**注**如果有多个测试源文件你可以倾向于使用一个test目录来组织它们。
* 多源文件应用
你可以在所有接收文件输入的命令中使用shell通配符。这允许你轻松处理来自一个目录下的多个文件例如
```shell
$ spring run *.groovy
```
如果你想将'test'或'spec'代码从主应用代码中分离,这项技术就十分有用了:
```shell
$ spring test app/*.groovy test/*.groovy
```
* 应用打包
你可以使用`jar`命令打包应用程序为一个可执行的jar文件。例如
```shell
$ spring jar my-app.jar *.groovy
```
最终的jar包括编译应用产生的类和所有依赖这样你就可以使用`java -jar`来执行它了。该jar文件也包括来自应用classpath的实体。你可以使用`--include`和`--exclude`添加明确的路径(两者都是用逗号分割,同样都接收值为'+'和'-'的前缀,'-'意味着它们将从默认设置中移除。默认包含includes
```shell
public/**, resources/**, static/**, templates/**, META-INF/**, *
```
默认排除(excludes)
```shell
.*, repository/**, build/**, target/**, **/*.jar, **/*.groovy
```
查看`spring help jar`可以获得更多信息。
* 初始化新工程
`init`命令允许你使用[start.spring.io](https://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`输出可以获得更多详情。例如下面的命令创建一个使用Java8和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'
```
* 使用内嵌shell
Spring Boot包括完整的BASH和zsh shells的命令行脚本。如果你不使用它们中的任何一个可能你是一个Window用户那你可以使用`shell`命令启用一个集成shell。
```shell
$ spring shell
Spring Boot (v1.3.0.BUILD-SNAPSHOT)
Hit TAB to complete. Type \'help' and hit RETURN for help, and \'exit' to quit.
```
从内嵌shell中可以直接运行其他命令
```shell
$ version
Spring CLI v1.3.0.BUILD-SNAPSHOT
```
内嵌shell支持ANSI颜色输出和tab补全。如果需要运行一个原生命令你可以使用`$`前缀。点击ctrl-c将退出内嵌shell。
* 为CLI添加扩展
使用`install`命令可以为CLI添加扩展。该命令接收一个或多个格式为`group:artifact:version`的artifact坐标集。例如
```shell
$ spring install com.example:spring-boot-cli-extension:1.0.0.RELEASE
```
除了安装你提供坐标的artifacts标识外所有依赖也会被安装。使用`uninstall`可以卸载一个依赖。和`install`命令一样,它接收一个或多个格式为`group:artifact:version`的artifact坐标集。例如
```shell
$ spring uninstall com.example:spring-boot-cli-extension:1.0.0.RELEASE
```
它会通过你提供的坐标卸载相应的artifacts标识和它们的依赖。
为了卸载所有附加依赖,你可以使用`--all`选项。例如:
```shell
$ spring uninstall --all
```
* 使用Groovy beans DSL开发应用
Spring框架4.0版本对beans{} DSL借鉴自[Grails](http://grails.org/)提供原生支持你可以使用相同的格式在你的Groovy应用程序脚本中嵌入bean定义。有时候这是一个包括外部特性的很好的方式比如中间件声明。例如
```java
@Configuration
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{}混合位于相同文件的类声明只要它们都处于顶级或如果你喜欢的话可以将beans DSL放到一个单独的文件中。