使用Gradle建立一個最簡單的Spring Boot專案

嗚嗚嗚啦啦啦發表於2016-11-30

很多剛開始用Gradle的不能執行是因為依賴下載失敗,請先看著篇文章: Gradle編譯時下載依賴失敗解決方法


  • 最近在學習 Spring Boot ,但是由於沒有科學上網,導致使用 Gradle 開發時編譯特別慢並且經常出錯,遇到很多問題,看了很多部落格都寫的非常零碎和混亂,今天在公司看了一天的官方文件才算是剛剛入門,所以記錄一下,希望能對初學者能有所幫助

開發工具及環境

  • JDK 1.7+
    • Spring Boot 要求 JDK 不低於1.6,推薦使用1.8
  • 編譯工具 Gradle
    • 安裝可以參考我之前寫的部落格(Gradle環境搭建),或其他很多教程都可以找到
  • 開發工具建議使用IDEA或者 STS(Spring Tool Suite
    • 因為整合度比較高,不需要再單獨下載外掛,如果使用 Eclipse 或 MyEclipse 需要單獨下載 Gradle 和 Spring 外掛,並且沒有科學上網很容易失敗,在這裡我們使用 IDEA 作為開發工具

Spring Boot 是什麼

  • Spring Boot 是 Spring 社群釋出的一個開源專案,旨在幫助開發者快速並且更簡單的構建專案。大多數 Spring Boot 專案只需要很少的配置檔案。

Spring Boot 特性

  • 建立獨立的 Spring 專案
  • 內建 Tomcat 和 Jetty 容器
  • 提供一個 starter POMs 來簡化 Maven 配置
  • 提供了一系列大型專案中常見的非功能性特性,如安全、指標,健康檢測、外部配置等
  • 完全沒有程式碼生成和 xml 配置檔案

Spring Boot 應用快速搭建官方文件


1. 建立一個 Gradle 專案,填入所需要的資訊


2. 建立相應的目錄

  • 因為 Spring Boot 使用 Gradle 編譯,所以有固定的檔案結構

  • 目錄結構

─src
     build.gradle
    ├─main
    │  ├─java
    │  │      SpringController.java
    │  │
    │  └─resources
    └─test
        ├─java
        └─resources

專案檔案結構


3. 建立一個 Controller 類(在 main 資料夾下)

  • SpringController.java
import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.stereotype.*;
import org.springframework.web.bind.annotation.*;

//表明這是一個 Controller
@Controller

//RestController是一種Rest風格的Controller,可以直接返回物件而不返回檢視,返回的物件可以使JSON,XML等
//@RestController

//使用自動配置,主動新增並解析bean,配置檔案等資訊
@EnableAutoConfiguration

public class SpringController {

    //設定訪問的url
    @RequestMapping("/")
    //表示返回JSON格式的結果,如果前面使用的是@RestController可以不用寫
    @ResponseBody
    String home() {
        return "Hello World!";//返回結果為字串
    }

    public static void main(String[] args) throws Exception {
        //通過SpringApplication的run()方法啟動應用,無需額外的配置其他的檔案
        SpringApplication.run(SpringController.class, args);
    }
}

4. 修改 build.gradle 檔案

  • build.gradle
  • 預設生成的 Gradle 檔案並不能滿足編譯 Spring Boot 應用,需要手動修改
buildscript {
    repositories {
        mavenCentral()//依賴Maven倉庫
    }
    dependencies {
        //使用1.4.2.RELEASE版本的Spring框架
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.4.2.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'spring-boot'

//生成的jar包包名和版本
jar {
    baseName = 'gs-rest-service'
    version =  '0.1.0'
}

repositories {
    mavenCentral()
}

//設定jdk的版本
sourceCompatibility = 1.8
targetCompatibility = 1.8

//新增編譯時的依賴
dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

5. 編譯專案

  • 在命令列進入到該專案根目錄下,輸入 gradle build 進行編譯
  • 編譯的過程中會下載很多的jar包,如果沒有科學上網可能會很慢

  • 編譯成功後輸出build successful

D:\WorkSpace\IntelliJIDEA\springboot>gradle build
The plugin id 'spring-boot' is deprecated. Please use 'org.springframework.boot' instead.
:compileJava                                                                                                               
:processResources UP-TO-DATE
:classes
:findMainClass
:jar
:bootRepackage                                                                                                        
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build

BUILD SUCCESSFUL

Total time: 5.807 secs
  • 也可以在左側的 gradle 中點選重新整理按鈕,效果是一樣的
    編譯專案

6. 啟動專案

  • 在命令列中輸入 gradle bootrun 進行啟動專案
  • 也可以使用左側的 gradle 中 Task 下的 application 中的 bootRun 按鈕啟動(參照上圖)
  • 預設的會啟動 tomcat,使用8080埠,如果埠被佔用會報錯

  • 啟動成功後會輸出以下內容

D:\WorkSpace\IntelliJIDEA\springboot>gradle bootrun
The plugin id 'spring-boot' is deprecated. Please use 'org.springframework.boot' instead.
:compileJava UP-TO-DATE                                                                                                                                            
:processResources UP-TO-DATE
:classes UP-TO-DATE
:findMainClass
:bootRun                                                     

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.4.2.RELEASE)

2016-11-30 22:14:47.878  INFO 9120 --- [           main] SpringController                         : Starting SpringController on H with PID 9120 (D:\WorkSpace\Intel
liJIDEA\springboot\build\classes\main started by 50185 in D:\WorkSpace\IntelliJIDEA\springboot)
2016-11-30 22:14:47.880  INFO 9120 --- [           main] SpringController                         : No active profile set, falling back to default profiles: default

2016-11-30 22:14:47.911  INFO 9120 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationC
onfigEmbeddedWebApplicationContext@57c758ac: startup date [Wed Nov 30 22:14:47 CST 2016]; root of context hierarchy
2016-11-30 22:14:49.330  INFO 9120 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2016-11-30 22:14:49.343  INFO 9120 --- [           main] o.apache.catalina.core.StandardService   : Starting service Tomcat
2016-11-30 22:14:49.344  INFO 9120 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.6
2016-11-30 22:14:49.457  INFO 9120 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2016-11-30 22:14:49.458  INFO 9120 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1550 ms
2016-11-30 22:14:49.642  INFO 9120 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
2016-11-30 22:14:49.647  INFO 9120 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2016-11-30 22:14:49.648  INFO 9120 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2016-11-30 22:14:49.648  INFO 9120 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2016-11-30 22:14:49.648  INFO 9120 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
2016-11-30 22:14:49.941  INFO 9120 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.
embedded.AnnotationConfigEmbeddedWebApplicationContext@57c758ac: startup date [Wed Nov 30 22:14:47 CST 2016]; root of context hierarchy
2016-11-30 22:14:50.022  INFO 9120 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/]}" onto java.lang.String SpringController.home()
2016-11-30 22:14:50.026  INFO 9120 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.Respons
eEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletReque
st)
2016-11-30 22:14:50.026  INFO 9120 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springf
ramework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http
.HttpServletResponse)
2016-11-30 22:14:50.050  INFO 9120 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.sp
ringframework.web.servlet.resource.ResourceHttpRequestHandler]
2016-11-30 22:14:50.050  INFO 9120 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springfram
ework.web.servlet.resource.ResourceHttpRequestHandler]
2016-11-30 22:14:50.088  INFO 9120 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class or
g.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016-11-30 22:14:50.209  INFO 9120 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2016-11-30 22:14:50.263  INFO 9120 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2016-11-30 22:14:50.267  INFO 9120 --- [           main] SpringController                         : Started SpringController in 2.734 seconds (JVM running for 3.049
)
2016-11-30 22:14:57.820  INFO 9120 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'
2016-11-30 22:14:57.820  INFO 9120 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2016-11-30 22:14:57.836  INFO 9120 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed i
n 16 ms
> Building 80% > :bootRun

7. 通過瀏覽器訪問該專案

  • 該專案因為配置的路徑為根路徑,所以直接訪問localhost:8080即可
  • 如果想停止執行該專案可以在命令列中按Ctrl+C,輸入Y即可停止
    訪問專案

  • 至此,一個最簡單的 Spring Boot 專案建立完成,想要學習更多的知識可以訪問官方的文件
  • 如果遇到 IDEA 中的 Controller 提示沒有引入包無法進行程式碼提示可以點選 Gradle 的重新整理按鈕,等待編譯完成就可以進行後續操作了

原始碼下載

操作步驟記錄

相關文章