Maven / Gradle 之Spring-Boot入門

Spring Boot是Spring 產品下的一個子項目,致力于快速便捷的搭建基于Spring的獨立可運行的項目。

Spring Boot 項目是帶嵌入式tomcat 功能

一:Maven項目
創建Maven項目就會自動生成一個配置文件pom.xml文件,項目所需要的依賴可以寫在這個文件中 。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>con.spring</groupId>
    <artifactId>Spring-Boot</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.3.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

如果不想繼spring-boot-starter-parent項目,也可以使用依賴管理來引入spring-boot的依賴:

<dependencyManagement>
     <dependencies>
        <dependency>
            <!-- Import dependency management from Spring Boot -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.3.2.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

創建類文件,寫入如下代碼:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class Application {

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

  public static void main(String[] args) throws Exception {
    SpringApplication.run(Application.class, args);
  }
}

說明:

  • @RestController和@RequestMapping注解是Spring MVC注解(它們不是Spring Boot的特定部分)。具體查看Spring參考文檔的MVC章節

  • @EnableAutoConfiguration。這個注解告訴Spring Boot根據添加的jar依賴猜測你想如何配置Spring。由于spring-boot-starter-web添加了Tomcat和Spring MVC,所以auto-configuration將假定你正在開發一個web應用并相應地對Spring進行設置。

  • main方法通過調用run,將業務委托給了Spring Boot的SpringApplication類。SpringApplication將引導我們的應用,啟動Spring,相應地啟動被自動配置的Tomcat web服務器。

使用mvn命令之前,需要安裝Maven : brew install maven

如果你的 pom.xml 使用了 spring-boot-starter-parent,則我們可以運行 :

$ mvn spring-boot:run

然后,使用瀏覽器打開 http://localhost:8080/ 你會看到下面的輸出:

Hello World!
點擊ctrl-c,可以關閉應用程序。

如果你的 pom.xml 中添加了 spring-boot-maven-plugin 插件,你可以運行:

$  mvn clean  package   // 命令在 target 目錄生成一個可執行的 jar 文件
$ java -jar target/spring-boot-example-0.0.1-SNAPSHOT.jar   //可以運行項目命令執行生成的 jar 文件:

命令啟動應用:
使用Maven 編譯項目的Spring-Boot應用的三種啟動方式

二:Gradle項目

Gradle 是什么?

Gradle 吸納了 ant 靈活的腳本特性、Maven 豐富的依賴管理策略和強大的插件式環境。

創建Gradle項目會自動生成一個build.gradle配置文件,項目所需要的依賴可以寫在這個文件中. 因為自動生成的內容是不夠的,故需要手動添加一些內容。

group 'com.test.gradle'
version '1.0-SNAPSHOT'
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.2.RELEASE")
    }
}
apply plugin: 'java' // 引入java插件,使得能夠用gradle build命令
apply plugin: 'org.springframework.boot'
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
    mavenCentral()
}
dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
}
dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    testCompile("org.springframework.boot:spring-boot-starter-test")
}

使用Gradle編譯運行項目:

$ gradle build  
$ gradle bootrun
使用Gradle Wrapper

對于Gradle項目來說,使用Gradle Wrapper是非常推薦的,它其實是一個gradle包,使用它的好處:

  • 不用安裝gradle也能運行gradle
  • 所有人使用相同的gradle版本
    使用Gradle Wrapper需要在build.gradle配置文件中加入:
task wrapper(type: Wrapper) {
    gradleVersion = '3.0'
}

然后在命令行運行:

gradle wrapper

此時會生成以下三個文件(夾):gradlew、gradlew.bat和gradle目錄
這里的gradlew和gradlew.bat其實只是腳本文件(前者用于Unix/Linux/Mac,后者用于Windows),在使用gradle命令的地方替換為gradlew或gradlew.bat,他們將自動下載指定的gradle版本,然后用該版本進行項目構建。如上文所示,本文中我們配置gradle版本為3.0。
請注意,這三個文件(夾)都需要提交到代碼庫中。
安利一個表格:


gradle 文件夾


定義:用于保存 gradle 下載路徑的配置文件位置,用于沒有gradle環境的環境初始化使用

gradle-wrapper.propertes      //gradle-wrapper 配置文件
gradle-wrapper.jar            //gradle-wrapper 核心 jar

gradle-wrapper.propertes中內容,打開該配置文件

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip

distributionUrl 是要下載的 gradle 的地址,使用哪個版本的 gradle,就在這里修改。
gradle 有 3 種版本:

  • gradle-xx-all.zip 是完整版,包含了各種二進制文件,源代碼文件,和離線的文檔。
  • gradle-xx-bin.zip 是二進制版,只包含了二進制文件(可執行文件),沒有文檔和源代碼。
  • gradle-xx-src.zip 是源碼版,只包含了 Gradle 源代碼,不能用來編譯你的工程。

結論:如果只是為了編譯,可以不用完整版,只需要二進制版即可,例如,gradle-2.14.1-bin.zip。

zipStoreBase 和 zipStorePath 組合在一起,是下載的 gradle-2.14.1-all.zip 所存放的位置。
zipStorePath 是 zipStoreBase 指定的目錄下的子目錄。

distributionBase 和 distributionPath 組合在一起,是解壓 gradle-2.14.1-all.zip 之后的文件的存放位置。
distributionPath 是 distributionBase 指定的目錄下的子目錄。

下載位置可以和解壓位置不一樣。

zipStoreBase 和distributionBase 有兩種取值:GRADLE_USER_HOME 和 PROJECT。
其中,GRADLE_USER_HOME 表示用戶目錄。
在 windows 下是 %USERPROFILE%/.gradle,例如C:\Users<user_name>.gradle\。
在 Linux下是 $HOME/.gradle,例如~/.gradle。

PROJECT 表示工程的當前目錄,即 gradlew 所在的目錄。

當項目其他人拿到代碼之后,由于gradlew和gradlew.bat文件均在項目源代碼中,他們本地即便沒有gradle,依然可以通過以下命令進行項目構建:

./gradlew build

如果你的項目有持續集成(CI)服務器(你也應該有),那么你的CI機器也沒有必要安裝Gradle了。另外,此時所有人都是使用的相同版本的gradle,進而避免了由于版本不同所帶來的問題。

在項目根目錄下啟動運行項目:

$ gradle clean bootrun

參考鏈接

調試

至少有兩種方式可以對Spring Boot項目進行調試。一種是直接運行命令:

./gradlew bootRun --debug-jvm

此時程序將默認監聽5005端口,并暫停以等待調試客戶端的連接,然后啟動Spring Boot。

另一種方式是使用Gradle的Application插件,在build.gradle中添加:

說了這么多
在使用 idea 創建 gradle或者 maven 項目時,需要輸入GroupId, ArtifactId, 那它們表示什么意思呢?
GroupId: 是項目組織結構唯一的標識符,實際對應JAVA的包的結構, 一般是:com.info.test.這樣
ArtifactId: 是項目的唯一的標識符,實際對應項目的名稱,就是項目根目錄的名稱

舉個例子:

groupid和artifactId被統稱為“坐標”,是為了保證項目唯一性而提出的
如果你要把你項目弄到maven本地倉庫去,你想要找到你的項目就必須根據這兩個id去查找

groupId一般分為多個段
這里我只說兩段,第一段為域,第二段為公司名稱。
域又分為org、com、cn等等許多,其中org為非營利組織,com為商業組織
舉個apache公司的tomcat項目例子:這個項目的groupId是org.apache,它的域是org(因為tomcat是非營利項目),公司名稱是apache,artigactId是tomcat。

又比如創建一個項目,一般會將:
groupId設置為cn.xxx,cn表示域為中國,xxx是我個人姓名縮寫
artifactId設置為testProj,表示你這個項目的名稱是testProj,依照這個設置,項目包結構最好是cn.snowin.testProj打頭的

buildscript 中的內容和外面內容區別?
buildscript {
    repositories {
        jcenter()
    }
    dependencies {     classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.2.RELEASE")
    }
}

buildscript 代碼塊中 :
repositories 的內容
dependencies 的內容
buildscript 里是 gradle 腳本自身執行所需的資源,包括:依賴項,第三方插件,maven 倉庫地址等

在build.gradle文件中直接聲明(在buildscript 之外)的依賴項、倉庫地址等信息是項目自身需要的依賴資源

gradle在執行腳本時,會優先執行buildscript代碼塊中的內容,然后才會執行剩余的build腳本
還有就是在buildscript代碼塊中你可以對dependencies使用classpath聲明。該classpath聲明說明了在執行其余的build腳本時,class loader可以使用這些你提供的依賴項

gradle 中的JCenter() 和mavenCenter() 區別?

jcenter() 和mavenCentral() 都是依賴組件倉庫
我們可以看到一般都是這樣用的:

repositories {
    mavenCentral()    
// maven中央倉庫(http://repo1.maven.org/maven2/)是由Sonatype公司提供的服務
它是Apache Maven、SBT和其他構建系統的默認倉庫,并能很容易被Apache Ant/Ivy、Gradle和其他工具所使用
可在http://search.maven.org/查詢構件。
}

repositories {
//是由JFrog公司提供的Bintray中的Java倉庫。它是當前世界上最大的Java和Android開源軟件構件倉庫。
     jenter()
 }

JCenter相比mavenCenter構件更多,性能也更好。但還是有些構件僅存在mavenCenter中。

checkstyle

CheckStyle是一種靜態代碼檢查工具,主要用于檢查代碼風格或格式是否滿足要求。首先,我們需要一份配置文件來配置這樣的要求,這里我們采用Google的Checkstyle配置文件。

在biuld.gradle中增加checkstyle插件:

apply plugin: 'checkstyle'

下載Google的checkstyle文件并將其拷貝為config/checkstyle/checkstyle.xml,Gradle的checkstyle插件默認將讀取該配置文件。

默認 CheckStyle 檢查將包含在./gradlew build中。

Checkstyle 插件向 project 中添加了以下 tasks:



所以可以執行如下命令去做代碼檢查:
gradle check
gradle checkstyleMain

運行Spring-boot踩過的坑

運行gradle build總是會出現構建失敗,其原因基本是:

默認的8080端口被占用

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容