693
技術社區[雲棲]
《Spring Boot官方指南》(二)入門(二)
3.2.5 命令行補全工具
Spring Boot CLI附帶了一些腳本,這些腳本為BASH 和zsh提供了命令行補全功能。在任何shell裏麵都可以source
到這些腳本(也叫spring
),也可以初始化到個人或者係統級別的命令行工具裏麵。在Debian係統裏麵,係統級別的腳本在這個路徑:/shell-completion/bash
,shell程序啟動以後,這裏麵的所有腳本都可以執行。例如,您已經使用SDKMAN!安裝了這些腳本,為了手動執行他們,可以這樣操作:
$ . ~/.sdkman/candidates/springboot/current/shell-completion/bash/spring $ spring <HIT TAB HERE> grab help jar run test version
![]() |
Note |
---|---|
如果您使用Homebrew或者MacPorts安裝了Spring Boot CLI,這些命令行補全腳本已經自動注入到了您的shell程序裏麵。 |
這是一個極其簡單的Web應用程序,可以用來驗證您的安裝是否正確。新建一個文件,文件名是app.groovy
:
@RestController class ThisWillActuallyRun { @RequestMapping("/") String home() { "Hello World!" } }
然後簡單運行一下這個命令:
$ spring run app.groovy
![]() |
Note |
---|---|
第一次運行這個應用程序,要下載一些依賴項目,將會耗費一些時間。以後再運行的話就會快很多了。 |
打開您的瀏覽器訪問localhost:8080,應該可以得到下麵的內容:
Hello World!
如果想要從舊版本的Spring Boot升級,檢查一下存放在這裏project wiki 的 “release notes”。您可以找到升級信息與每個版本的“新的和值得關注的”功能列表以及說明。
使用相關的包管理工具升級您已經使用命令行安裝過的早期版本(比如,brew upgrade
),另外,如果您是手動安裝的CLI,閱讀這個標準說明,同時記得更新環境變量PATH
的值,以便移除舊版本的引用。
用Java語言開發一個簡單的Web應用程序“Hello World!”,我們將會特別提到一些Spring Boot關鍵特性。就用Maven來構建這個項目,因為很多IDE都支持Maven。
![]() |
Tip |
---|---|
這個網站spring.io有很多使用了Spring Boot的 “入門”級別教程。如果需要解決個別的問題,可以先去這個網站找找看。可以簡化下麵的開發步驟。訪問網站start.spring.io,在依賴搜索裏麵選擇web 啟動。這樣就可以自動生成一個新的項目框架,以便您以恰當的方式開始編寫您的代碼。更多有關的細節,可以查看文檔。 |
在我們開始之前,打開終端確認您已經安裝了恰當Java和Maven版本。
$ java -version java version "1.7.0_51" Java(TM) SE Runtime Environment (build 1.7.0_51-b13) Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
$ mvn -v Apache Maven 3.2.3 (33f8c3e1027c3ddde99d3cdebad2656a31e8fdf4; 2014-08-11T13:58:10-07:00) Maven home: /Users/user/tools/apache-maven-3.1.1 Java version: 1.7.0_51, vendor: Oracle Corporation
![]() |
Note |
---|---|
這個實例創建在自己的目錄中。接下來內容假定您已經創建好了恰當的目錄,這個目錄叫“當前目錄”。 |
我們從創建一個Mavenpom.xml
文件開始。pom.xml
是用來構建您的項目的描述性文件。用文本編輯器把下麵的內容輸入到這個文件。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>myproject</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.1.BUILD-SNAPSHOT</version> </parent> <!-- Additional lines to be added here... --> <!-- (you don't need this if you are using a .RELEASE version) --> <repositories> <repository> <id>spring-snapshots</id> <url>https://repo.spring.io/snapshot</url> <snapshots><enabled>true</enabled></snapshots> </repository> <repository> <id>spring-milestones</id> <url>https://repo.spring.io/milestone</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-snapshots</id> <url>https://repo.spring.io/snapshot</url> </pluginRepository> <pluginRepository> <id>spring-milestones</id> <url>https://repo.spring.io/milestone</url> </pluginRepository> </pluginRepositories> </project>
像這樣,應該可以進行構建工作了,運行一下命令mvn package
看看輸出信息(現在暫時忽略這個警告信息“jar will be empty – no content was marked for inclusion!”)。
![]() |
Note |
---|---|
現在您也可以把這個項目導入進入一個IDE了(大多數的現代JAVA IDE內置了Maven)。為了方便,我們繼續使用純文本編輯器來開發這個例子。 |
Spring Boot提供了一些“Starters”,讓您方便把jar文件添加到您的classpath。我們的實例已經在POM文件的parent
部分添加了spring-boot-starter-parent
。spring-boot-starter-parent
是一個添加了一些默認Maven配置的特殊的starter。也添加了dependency-management
部分,這個部分可以讓您省掉某些依賴項的version
標簽。
其他的 “Starters”添加了在您開發其他特定類型應用程序的時候,您很可能需要添加的一些依賴項。我們目前正在開發Web應用,我們需要添加依賴項spring-boot-starter-web
,不過我們先通過下麵的方式看看目前的情況。
$ mvn dependency:tree [INFO] com.example:myproject:jar:0.0.1-SNAPSHOT
mvn dependency:tree
命令輸出了項目依賴項的樹狀示意圖。您會發現spring-boot-starter-parent
本身並沒有引入任何依賴。編輯pom.xml
文件, 把spring-boot-starter-web
依賴添加到parent
部分的下麵:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
再次運行一下mvn dependency:tree
,您可以發現現在增加了一些依賴項,包括Tomcat Web服務器和Spring Boot。
需要編寫一個簡單的Java文件來完成我們的應用程序。Maven默認在src/main/java
這個目錄下編譯源文件,所以您創建好目錄,然後新建一個源文件src/main/java/Example.java
:
import org.springframework.boot.*; import org.springframework.boot.autoconfigure.*; import org.springframework.stereotype.*; import org.springframework.web.bind.annotation.*; @RestController @EnableAutoConfiguration public class Example { @RequestMapping("/") String home() { return "Hello World!"; } public static void main(String[] args) throws Exception { SpringApplication.run(Example.class, args); } }
雖然代碼量不多,不多其實內容很豐富。我們逐步理解一下關鍵步驟。
Example
類的第一個注解是@RestController
。這叫做構造型注解。它提示我們,對Spring來說,這個類扮演了特殊的角色,現在,這個類是一個Web控製器
,Spring將會使用它來處理Web請求。
@RequestMapping
注解展示了 “routing”信息。它告知Spring路徑為“/”的HTTP請求都會映射到home
方法。@RestController
告知Spring直接將結果字符串返回給請求方。
![]() |
Tip |
---|---|
@RestController 與@RequestMapping 注解屬於 Spring MVC(它們不屬於Spring Boot).更多資料,可以查看Spring參考文檔的MVC 部分。 |
第二個類級別的注解是@EnableAutoConfiguration
。 這個注解告知Spring Boot自己 “判斷”您是如何配置Spring的,這基於您添加的依賴項。因為依賴項spring-boot-starter-web
添加了Tomcat和Spring MVC,所以@EnableAutoConfiguration
注解會判斷您是在開發Web應用程序並且引入了Spring。
Starters and Auto-Configuration
Auto-configuration是為了和“Starters”一起良好工作而設計的,但是這兩個部分並沒有耦合在一起。您在starters的約束之外自由挑選jar依賴,而Spring Boot將會盡可能的自配置以適應您的應用程序。
現在我們的程序應該可以工作了。因為我們在POM文件裏麵使用了spring-boot-starter-parent
,所以我們可以使用run
指令來啟動應用程序了。在項目根目錄輸入mvn spring-boot:run
啟動應用程序:
$ mvn spring-boot:run . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.4.1.BUILD-SNAPSHOT) ....... . . . ....... . . . (log output here) ....... . . . ........ Started Example in 2.222 seconds (JVM running for 6.514)
打開瀏覽器訪問localhost:8080,您應該可以看到輸出了下麵的內容:
Hello World!
敲擊ctrl-c
就能退出程序了。
就像生產一個真正的軟件產品,我們創建一個完整自足的可執行jar文件,把我們的第一個實例完成。可執行的jar文件(有時候我們也叫“富jar文件”)是一個歸檔文件,包含了編譯好的類文件與我們運行程序所需要的所有jar依賴項。
可執行jar文件與Java
Java並沒有提供任何加載內嵌jar文件的標準方法(也就是jar文件還包含jar文件)。所以,如果您想發布一個完整的應用程序,將會很困難。
為了解決這個問題,許多開發者使用“uber” jars。 一個uber jar文件把所有的類,包括第三方jar包的類,都歸檔到一個文件。這也帶來了問題,這將難以辨認哪些庫是您的應用程序真正采用的。還有,如果多個jar文件裏麵采用了相同的文件名(但是內容不同),也會引起問題。
Spring Boot采用了一種不同的方式來讓您直接加載內嵌的jar包。
為了創建可執行jar文件,我們把spring-boot-maven-plugin
添加到pom.xml
。把下麵的代碼添加到dependencies
部分下麵:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
![]() |
Note |
---|---|
spring-boot-starter-parent POM包含綁定到repackage 目標的<executions> 配置。如果不使用parentPOM,你需要自己聲明該配置,具體參考插件文檔。 |
保存pom.xml
,並從命令行運行mvn package
:
$ mvn package [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building myproject 0.0.1-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] .... .. [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ myproject --- [INFO] Building jar: /Users/developer/example/spring-boot-example/target/myproject-0.0.1-SNAPSHOT.jar [INFO] [INFO] --- spring-boot-maven-plugin:1.4.1.BUILD-SNAPSHOT:repackage (default) @ myproject --- [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------
如果查看target
目錄,你應該可以看到myproject-0.0.1-SNAPSHOT.jar
,該文件大概有10Mb。想查看內部結構,可以運行jar tvf
:
$ jar tvf target/myproject-0.0.1-SNAPSHOT.jar
在該目錄下,你應該還能看到一個很小的名為myproject-0.0.1-SNAPSHOT.jar.original
的文件, 這是在Spring Boot重新打包前,Maven創建的原始jar文件。
使用java -jar
命令運行該程序:
$ java -jar target/myproject-0.0.1-SNAPSHOT.jar . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.4.1.BUILD-SNAPSHOT) ....... . . . ....... . . . (log output here) ....... . . . ........ Started Example in 2.536 seconds (JVM running for 2.864)
正如剛才一樣,敲擊ctrl-c退出應用。
希望本章的內容已經讓您理解了部分Spring Boot的基礎知識,並且掌握了以您的方式開發應用程序的方法。如果您麵向任務的類型的開發人員,您可能想要直接跳到spring.io,查閱一些解決“怎樣和Spring一起工作”這個問題的入門教程。我們也有一些Spring Boot定製的怎麼做的參看文檔。
Spring Boot倉庫也可以運行的一些例子。這些例子和其他代碼無關的(也就是說您不需要構建其他的代碼就能運行或者使用這些例子)。
另外,按照順序,接下來的內容是Part III, “Using Spring Boot”.。如果您真的缺乏耐心,可以繼續往前,閱讀Spring Boot特性。
最後更新:2017-05-19 14:06:27