artifacts
。咱們建議您選擇Maven
或Gradle
。Spring Boot能夠與其餘構建系統(例如Ant)一塊兒工做,可是它們之間的兼容性並非特別好。Pom.xml
文件中)的任何這些依賴項提供一個版本(也就是能夠省略version
標籤),由於Spring Boot正在爲您進行管理(也就是Spring Boot 已經幫咱們配置了)。當您升級Spring Boot自己(也就是切換到更高版本的Spring Boot)時,這些依賴關係也將以一致的方式進行升級。
若是你以爲這是必要的,你仍然能夠指定一個版本並覆蓋Spring Boot的建議。html
spring-boot-dependencies
)提供,也能夠爲Maven和Gradle提供額外的專用支持。
Spring Boot的每一個版本都與一個Spring Framework的基礎版本相關聯,所以咱們強烈建議您不要自行指定其版本。java
spring-boot-starter-parent
項目中繼承,以得到相應的默認值。 父項目提供如下功能:
<version>
標籤,進而從spring-boot-dependencies POM
中繼承。application.properties
和application.yml
中的配置進行資源過濾(其實就是maven
打包時指定哪些文件要過濾,不參與打包),包括特定於配置文件的文件(例如application-foo.properties
和application-foo.yml
)spring-boot-starter-parent
中繼承,只需設置<parent>
:<!-- Inherit defaults from Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
複製代碼
您只須要在上面
parent
依賴項上指定Spring Boot版本號。 若是您導入更多的starter
,則能夠安全地省略版本號(即<version>
)。git
pom.xml
中。<properties>
<spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</properties>
複製代碼
檢查
spring-boot-dependencies pom
以獲取支持的屬性列表。github
spring-boot-starter-parent POM
的方式來使用 Spring Boot,可能你有本身的標準(也就是自定義配置)或者你單單就喜歡顯式地聲明全部的maven
配置。spring-boot-starter-parent
,你仍然能夠經過使用scope = import dependency
來保留依賴關係管理(但不是插件管理):<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.9.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
複製代碼
spring-boot-dependencies
標籤(也就是pom
文件的dependencies
標籤)以前在項目的dependencyManagement
中添加一個條目。 例如,要升級到另外一個Spring Data
發行版,您須要將如下內容添加到您的pom.xml
中。<dependencyManagement>
<dependencies>
<!-- Override Spring Data release train provided by Spring Boot -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-releasetrain</artifactId>
<version>Fowler-SR2</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.9.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
複製代碼
在上面的例子中,咱們指定了一個BOM(物料清單,這裏指的是
pom.xml
),可是任何依賴類型均可以被覆蓋。web
spring-boot-starter-parent
選擇至關保守的Java
兼容性(指的是上面說的 Java 6
)。 若是您想遵循咱們的建議並使用較新的Java版本,則能夠添加一個java.version屬性:<properties>
<java.version>1.8</java.version>
</properties>
複製代碼
<plugins>
部分:<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
複製代碼
若是你使用Spring Boot的起始
parent POM
,你只須要添加插件,除非你想改變在父代中定義的配置,不然不須要進行配置。正則表達式
dependencies
部分導入starters
。 與Maven
不一樣的是,沒有super parent
能夠導入來共享某些配置。repositories {
jcenter()
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-web:1.5.9.RELEASE")
}
複製代碼
spring-boot-gradle-plugin
也是可用的,並提供了建立可執行jar
和從源項目運行項目的任務。 它還提供依賴管理,除其餘功能外,還容許您省略由Spring Boot
管理的任何依賴項的版本號:plugins {
id 'org.springframework.boot' version '1.5.9.RELEASE'
id 'java'
}
repositories {
jcenter()
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-web")
testCompile("org.springframework.boot:spring-boot-starter-test")
}
複製代碼
starters
是一系列能夠引進你項目的依賴描述符(dependency descriptors我以爲其實就是一些jar
包,裏邊的pom.xml
文件幫咱們作了某些配置而已)。您能夠獲得所須要的全部關於Spring
及其相關技術的一站式服務,無需搜索示例代碼,也不須要粘貼大量依賴描述符(傳統咱們pom.xml
都要引入不少的<dependency/>
)。例如,若是你想開始使用Spring
和JPA
來訪問數據庫,只需在你的項目中加入spring-boot-starter-data-jpa
依賴項,你就能夠開始編碼了喲~starters
包含了許多你須要快速運行一個項目並傳遞依賴項的依賴。(即它會自動傳遞依賴)。
爲何叫
starters
這個名字呢?全部的官方
starter
都遵循這個spring-boot-starter-*
命名規範,*
表明某一具體的應用(好比web應用程序)。這種命名結構旨在幫助您找到某一具體的starter
。許多IDE中的Maven集成容許您按名稱搜索依賴項。例如,安裝某一具體的Eclipse``STS
插件後,只需在POM
編輯器中點擊ctrl-space
,而後鍵入「spring-boot-starter」
獲取完整列表。正如建立本身的starter中所解釋的,第三方starter
不該該以spring-boot
爲開始,由於它是爲官方Spring Boot工件(artifacts)保留的。一個表示acme
應用的第三方starter
的命名可能就是acme-spring-boot-starter
。redis
org.springframework.boot
包下定義的一些starter
: starters
名稱 | 描述 | Pom |
---|---|---|
spring-boot-starter |
核心starter ,包括自動配置支持,日誌記錄和YAML |
POM |
spring-boot-starter-activemq |
使用Apache ActiveMQ進行JMS 消息傳遞 |
POM |
spring-boot-starter-amqp |
使用 Spring AMQP和Rabbit MQ | POM |
spring-boot-starter-aop |
使用Spring AOP和AspectJ進行面向方面編程的starter |
POM |
spring-boot-starter-artemis |
使用Apache Artemis 進行JMS 消息傳遞 |
POM |
spring-boot-starter-batch |
使用Spring Batch |
POM |
spring-boot-starter-cache |
使用Spring框架的緩存支持 | POM |
spring-boot-starter-cloud-connectors |
使用Spring Cloud鏈接器的starter ,可簡化Cloud Foundry和Heroku等雲平臺中的服務鏈接 |
POM |
spring-boot-starter-data-cassandra |
使用Cassandra分佈式數據庫和Spring Data Cassandra | POM |
spring-boot-starter-data-couchbase |
使用面向文檔的數據庫Couchbase和Spring Data Couchbase | POM |
spring-boot-starter-data-elasticsearch |
使用搜索、分析引擎Elasticsearch和Spring Data Elasticsearch | POM |
spring-boot-starter-data-gemfire |
使用分佈式數據存儲GemFire和Spring Data GemFire | POM |
spring-boot-starter-data-jpa |
使用帶有Hibernate的Spring Data JPA | POM |
spring-boot-starter-data-ldap |
使用Spring Data LDAP | POM |
spring-boot-starter-data-mongodb |
使用面向文檔的數據庫MongoDB和Spring Data MongoDB | POM |
spring-boot-starter-data-neo4j |
使用圖形數據庫Neo4j和Spring Data Neo4j | POM |
spring-boot-starter-data-redis |
使用帶有Spring Data Redis和Jedis客戶端的Redis鍵值數據存儲 | POM |
spring-boot-starter-data-rest |
Starter for exposing Spring Data repositories over REST using Spring Data REST | POM |
spring-boot-starter-data-solr |
結合Spring Data Solr使用Apache Solr 搜索平臺 | POM |
spring-boot-starter-freemarker |
使用FreeMarker視圖構建MVC Web應用程序 | POM |
spring-boot-starter-groovy-templates |
使用Groovy模板視圖構建MVC Web應用程序 | POM |
spring-boot-starter-hateoas |
使用Spring MVC和Spring HATEOAS構建基於超媒體的RESTful Web應用程序 | POM |
spring-boot-starter-integration |
使用Spring集成 | POM |
spring-boot-starter-jdbc |
將JDBC與Tomcat JDBC鏈接池配合使用 | POM |
spring-boot-starter-jersey |
使用JAX-RS和Jersey構建RESTful Web應用程序的starter 。是Spring-Boot-Starter-Web 的另外一種選擇 |
POM |
spring-boot-starter-jooq |
使用jOOQ訪問SQL數據庫的starter 。 spring-boot-starter-data-jpa 或spring-boot-starter-jdbc 的替代方案 |
POM |
spring-boot-starter-jta-atomikos |
使用Atomikos的JTA事務 | POM |
spring-boot-starter-jta-bitronix |
使用Bitronix的JTA事務 | POM |
spring-boot-starter-jta-narayana |
Spring Boot Narayana JTA Starter |
POM |
spring-boot-starter-mail |
使用Java Mail和Spring Framework支持的電子郵件發送 | POM |
spring-boot-starter-mobile |
使用Spring Mobile構建Web應用程序 | POM |
spring-boot-starter-mustache |
使用Mustache視圖構建MVC Web應用程序 | POM |
spring-boot-starter-security |
使用Spring Security | POM |
spring-boot-starter-social-facebook |
使用Spring社交Facebook | POM |
spring-boot-starter-social-linkedin |
使用Spring社交LinkedIn | POM |
spring-boot-starter-social-twitter |
使用Spring社交twitter | POM |
spring-boot-starter-test |
Starter用於測試包含JUnit,Hamcrest和Mockito等庫的Spring Boot應用程序 | POM |
spring-boot-starter-thymeleaf |
使用Thymeleaf視圖構建MVC Web應用程序 | POM |
spring-boot-starter-validation |
經過Hibernate Validator使用Java Bean驗證 | POM |
spring-boot-starter-web |
用於構建Web的starter ,包括使用Spring MVC的RESTful應用程序。 使用Tomcat做爲默認的嵌入容器 |
POM |
spring-boot-starter-web-services |
使用Spring Web Services | POM |
spring-boot-starter-websocket |
使用Spring Framework的WebSocket支持構建WebSocket應用程序 | POM |
starter
以外,還可使用如下starter
來作好相應的生產準備: starters
名稱 | 描述 | POM |
---|---|---|
spring-boot-starter-actuator |
使用具備生產準備功能的Spring Boot的執行器,能夠幫助您監控和管理您的應用程序 | POM |
spring-boot-starter-remote-shell |
使用CRaSH遠程shell經過SSH監視和管理您的應用程序。 自1.5以來已棄用 | POM |
starters
: starters
名稱 | 描述 | POM |
---|---|---|
spring-boot-starter-jetty |
使用Jetty做爲嵌入式servlet容器的starter 。 spring-boot-starter-tomcat 的替代方案 |
POM |
spring-boot-starter-log4j2 |
使用Log4j2進行日誌記錄的starter 。spring-boot-starter-logging 的替代方法 |
POM |
spring-boot-starter-logging |
使用Logback進行日誌記錄。 默認日誌starter |
POM |
spring-boot-starter-tomcat |
使用Tomcat做爲嵌入式servlet容器的starter 。 spring-boot-starter-web 使用的默認servlet容器starter |
POM |
spring-boot-starter-undertow |
使用Undertow做爲嵌入式servlet容器的starter 。 spring-boot-starter-tomcat 的替代方案 |
POM |
有關其餘社區貢獻者的列表,請參閱GitHub上的
spring-boot-starters
模塊中的README文件。spring
package
時,咱們通常會認爲這個類位於「默認包」中。一般不鼓勵使用「默認軟件包」,且應該避免使用「默認軟件包」。對於使用@ComponentScan
,@EntityScan
或@SpringBootApplication
註釋的Spring Boot應用程序來講,使用「默認包」可能會致使特定的問題,由於每一個jar的每一個類都將被讀取。(這裏其實說的是Spring Boot會進行組件、實體、包的掃描@ComponentScan
)
咱們建議您遵循Java推薦的軟件包命名約定,並使用反向域名(例如com.example.project)。mongodb
@EnableAutoConfiguration
註釋一般放在主類上,而且它隱含地爲某些項目定義了一個基本的「搜索包」。例如,若是您正在編寫JPA應用程序,則@EnableAutoConfiguration
註釋類的包將用於搜索@Entity
條目。@ComponentScan
註釋而不須要指定basePackage
屬性。若是您的主類位於根包中,也可使用@SpringBootApplication
註釋。com
+- example
+- myproject
+- Application.java
+- domain
+- Customer.java
+- CustomerRepository.java
+- service
+- CustomerService.java
+- web
+- CustomerController.java
複製代碼
Application.java
文件將聲明main
方法以及基本的@Configuration
。package com.example.myproject;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
複製代碼
SpringApplication.run()
,咱們一般建議您的主要來源是@Configuration
類。一般,定義main
方法的類也是@Configuration
的一個首選。
在互聯網上已經發布了許多使用XML配置的Spring配置示例。 若是可能,請始終嘗試使用基於Java的等效配置。 搜索
Enable*
註釋能夠是一個很好的起點。shell
@Configuration
放到一個類中。@Import
註解可用於導入其餘配置類。或者,您可使用@ComponentScan
自動獲取全部Spring組件,包括@Configuration
類。@Configuration
類開頭。而後您可使用額外的@ImportResource
註解來加載XML配置文件。@EnableAutoConfiguration
或@SpringBootApplication
註釋添加到其中一個@Configuration
類來選擇自動配置。
您應該只添加一個
@EnableAutoConfiguration
註釋。 咱們一般建議您將其添加到您的主要@Configuration
類。
DataSource
Bean,則默認的嵌入式數據庫支持將失效。--debug
參數啓動您的應用程序(也就是debug模式啓動應用程序)。 這將啓用選擇核心記錄器的調試日誌,並將自動配置報告記錄到控制檯。@EnableAutoConfiguration
的exclude
屬性來禁用它們。import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;
@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}
複製代碼
spring.autoconfigure.exclude
屬性(這個主要在property
文件中聲明)來控制自動配置類的列表。
你能在註解級別和
property
配置文件級別設置警用自動相應的配置。(注:一個類聲明瞭@Configuration
註解則表示該類是一個配置類,能夠被禁用)
bean
及其注入的依賴關係。 爲了簡單起見,咱們常常發現使用@ComponentScan
來查找bean
,並結合使用@Autowired
構造函數注入效果最好。@ComponentScan
而不帶任何參數。 全部的應用程序組件(@Component
,@Service
,@Repository
,@Controller
等)都將被自動註冊爲Spring Bean
。@Service Bean
,它使用構造函數注入來得到必需的RiskAssessor bean
。package com.example.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DatabaseAccountService implements AccountService {
private final RiskAssessor riskAssessor;
@Autowired
public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}
複製代碼
bean
有一個構造函數,你能夠省略@Autowired
。@Service
public class DatabaseAccountService implements AccountService {
private final RiskAssessor riskAssessor;
//此處省略了@Autowired
public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}
複製代碼
riskAssessor
字段被標記爲final
,代表它不能被隨後更改。@Configuration
,@EnableAutoConfiguration
和@ComponentScan
註解其主類。因爲這些註釋常常一塊兒使用(特別是若是您遵循以上最佳實踐),Spring Boot提供了一種更方便的@SpringBootApplication
替代方法。@SpringBootApplication
註釋等價於使用@Configuration
,@EnableAutoConfiguration
和@ComponentScan
及其默認屬性:package com.example.myproject;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
複製代碼
@SpringBootApplication
還提供別名來自定義@EnableAutoConfiguration
和@ComponentScan
的屬性。
本節僅介紹基於jar的打包。若是您選擇將應用程序打包爲war文件,則應參考您的服務器和IDE文檔。
Maven
項目,例如在Eclipse
的File -> Import -> Existing Maven Projects
。若是您不當心運行了兩次Web應用程序,則會看到「端口已被使用Port already in use」錯誤。 STS用戶可使用
"Relaunch"
按鈕而不是"Run"
來確保關閉任何現有的實例。
若是您使用Spring Boot Maven或Gradle插件建立可執行jar
,則可使用java -jar
運行應用程序。 例如:
$ java -jar target/myproject-0.0.1-SNAPSHOT.jar
也能夠運行打包的應用程序並啓用遠程調試支持。 這使您能夠將調試器附加到打包的應用程序中:(主要用於遠程調試) $ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \ -jar target/myproject-0.0.1-SNAPSHOT.jar
Spring Boot Maven插件包含一個可用於快速編譯和運行應用程序的run
目標。 應用程序以分解形式運行,就像在IDE中同樣。
$ mvn spring-boot:run
您可能還想使用有用的操做系統環境變量:
$ export MAVEN_OPTS=-Xmx1024m -XX:MaxPermSize=128M
Spring Boot Gradle插件還包含一個bootRun
任務,可用於以分解形式運行您的應用程序。 不管什麼時候導入spring-boot-gradle-plugin
,都會添加bootRun
任務:
$ gradle bootRun
您可能還想使用有用的操做系統環境變量:
$ export JAVA_OPTS=-Xmx1024m -XX:MaxPermSize=128M
Spring Boot包含一組額外的工具,可使應用程序開發體驗更愉快。 spring-boot-devtools模塊能夠包含在任何項目中以提供額外的開發時間功能。 要包含devtools支持,只需將模塊依賴關係添加到您的版本:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
複製代碼
dependencies {
compile("org.springframework.boot:spring-boot-devtools")
}
複製代碼
運行完整打包的應用程序時,開發者工具會自動禁用。 若是您的應用程序是使用
java -jar
方式啓動的,或者若是它是使用特殊的類加載器啓動的,那麼它就被認爲是「生產應用程序」。 將依賴關係標記爲可選的是一種最佳實踐,能夠防止devtools經過項目傳遞到其餘模塊。 Gradle不支持optional
的依賴關係,所以您可能但願在此期間看看propdeps插件。
從新打包的
archives
在默認狀況下不包含devtools。 若是您想使用某些遠程devtools功能,則須要禁用excludeDevtools
構建屬性以包含它。 該屬性支持Maven和Gradle插件。
application.properties
文件中的設置進行配置。 例如,Thymeleaf提供了spring.thymeleaf.cache
屬性。 而不須要手動設置這些屬性,spring-boot-devtools
模塊將自動應用合理的開發配置。
有關應用的屬性的完整列表,請參閱DevToolsPropertyDefaultsPostProcessor。
使用spring-boot-devtools
的應用程序將在類路徑上的文件發生更改時自動重啓。 在IDE中工做時,這是一個很是有用的功能,由於它爲代碼更改提供了一個很是快速的反饋循環。 默認狀況下,將監視指向文件夾的類路徑中的任何條目以進行更改。 請注意,某些資源(如靜態資產和視圖模板)不須要從新啓動應用程序。
觸發重啓
因爲DevTools監視類路徑資源,觸發重啓的惟一方法是更新類路徑。 致使類路徑更新的方式取決於您使用的IDE。 在Eclipse中,保存修改後的文件將致使類路徑更新並觸發重啓。 在IntelliJ IDEA中,構建項目(
Build - > Make Project
)將具備相同的效果。
您也能夠經過受支持的構建插件(即Maven和Gradle)啓動您的應用程序,只要啓用了分叉功能,由於DevTools須要隔離的應用程序類加載器才能正常運行。 當Gradle和Maven在類路徑中檢測到DevTools時,默認會這樣作。
與LiveReload一塊兒使用時,自動從新啓動的效果很是好。 詳情請參閱下文。 若是使用JRebel,自動從新啓動將被禁用,以支持動態類從新加載。 其餘devtools功能(如LiveReload和屬性覆蓋)仍然可使用。
DevTools依靠應用程序上下文的關閉掛鉤在從新啓動期間關閉它。 若是您禁用了關閉掛鉤(
SpringApplication.setRegisterShutdownHook(false)
),它將沒法正常工做。
當肯定類路徑上的條目在更改時會觸發從新啓動時,DevTools會自動忽略名爲spring-boot,
spring-boot-devtools
,spring-boot-autoconfigure
,spring-boot-actuator
和spring-boot-starter
的項目。
DevTools須要自定義
ApplicationContext
使用的ResourceLoader
:若是你的應用程序已經提供了一個,它將被打包。 不支持直接覆蓋ApplicationContext
上的getResource
方法。
Spring Boot提供的重啓技術經過使用兩個類加載器來工做。 不改變的類(例如來自第三方jar的類)被加載到基類加載器中。 您正在開發的類將加載到重啓類加載器中。 當應用程序從新啓動時,重啓類加載器將被丟棄,並建立一個新的。 這種方法意味着應用程序從新啓動一般比「冷啓動」快得多,由於基類加載器已經可用而且已經被填充了。
若是您發現從新啓動對於您的應用程序來講不夠快,或者遇到類加載問題,則能夠考慮從ZeroTurnaround中獲取從新加載的技術,例如JRebel。 這些工做經過重寫類,由於他們被加載,使他們更容易從新加載。 Spring Loaded提供了另外一種選擇,可是它不支持許多框架,而且沒有商業支持。
某些資源不必定須要在更改時觸發從新啓動。 例如,Thymeleaf
模板能夠就地編輯。 默認狀況下,更改/META-INF/maven
,/META-INF/resources
,/resources
,/static
,/public
或/templates
中的資源不會觸發從新啓動,但會觸發實時從新加載。 若是你想自定義這些排除,你可使用spring.devtools.restart.exclude
屬性。 例如,要僅排除/static
和/public
,您能夠設置如下內容:
spring.devtools.restart.exclude=static/**,public/**
若是要保留這些默認值並添加其餘排除項,請改成使用
spring.devtools.restart.additional-exclude
屬性。
spring.devtools.restart.additional-paths
屬性來配置其餘路徑以監視更改。 您可使用上述的spring.devtools.restart.exclude
屬性來控制額外路徑下的更改是否會觸發徹底從新啓動或僅實時從新加載。spring.devtools.restart.enabled
屬性將其禁用。 在大多數狀況下,你能夠在你的application.properties
中設置它(這將仍然初始化重啓類加載器,但它不會監視文件的變化,也就是隻要你從新啓動了Spring Boot應用程序,都會沖洗初始化一個新的重啓類加載器,上文也提到了)。(注意從新啓動
和關閉後啓動
的區別)SpringApplication.run(...)
以前設置System
屬性。 例如:public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);
}
複製代碼
spring.devtools.restart.trigger-file
屬性。
您可能須要將
spring.devtools.restart.trigger-file
設置爲全局設置,以便全部項目的行爲方式相同
正如上面「從新啓動vs從新加載」一節所述,從新啓動功能是經過使用兩個類加載器(一個基類,一個重啓類)來實現的。 對於大多數應用程序來講,這種方法運行良好,但有時候會致使類加載問題。
默認狀況下,IDE中的任何打開的項目都將使用「重啓」類加載器加載,任何常規的.jar
文件都將使用「基本」類加載器加載。 若是您使用多模塊項目,而不是將每一個模塊導入到IDE中,則可能須要自定義項目。 要作到這一點,你能夠建立一個META-INF/spring-devtools.properties
文件。
spring-devtools.properties
文件能夠包含restart.exclude
和restart.include
前綴屬性。include
元素是應該被拉入到「重啓」類加載器中的項目,排除元素是應該被下推到「基本」類加載器中的項目。 該屬性的值是一個將應用於類路徑的正則表達式模式。
好比:
restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar
複製代碼
全部的屬性
key
(這裏指上面的companycommonlibs
)必須是惟一的。 只要屬性以restart.include
或restart.exclude
開頭的都將被考慮。
全部類路徑中的
META-INF/spring-devtools.properties
都將被加載。 您能夠將文件打包到項目中,也能夠打包到項目使用的庫中。
ObjectInputStream
進行反序列化的對象,從新啓動功能沒法正常工做。 若是須要反序列化數據,則可能須要將Spring的ConfigurableObjectInputStream
與Thread.currentThread().getContextClassLoader()
一塊兒使用。spring-boot-devtools
模塊包含一個嵌入式LiveReload
服務器,當資源發生變化時,可用於觸發瀏覽器刷新。 LiveReload
瀏覽器擴展可從livereload.com的Chrome,Firefox和Safari免費得到。spring.devtools.livereload.enabled
屬性設置爲false
。
一次只能運行一個LiveReload服務器。 在開始您的應用程序以前,請確保沒有其餘
LiveReload
服務器正在運行。 若是您從IDE啓動多個應用程序,則只有第一個應用程序支持LiveReload
。
您能夠經過將一個名爲.spring-boot-devtools.properties
的文件添加到您的$HOME
文件夾來配置全局devtools設置(請注意,文件名以"."開頭)。 添加到此文件的任何屬性都將應用於使用devtools的計算機上的全部Spring Boot應用程序。 例如,要將從新啓動配置爲始終使用觸發器文件,能夠添加如下內容:
spring.devtools.reload.trigger-file=.reloadtrigger
Spring Boot開發人員工具不只限於本地開發。 您還能夠在遠程運行應用程序時使用多個功能。 遠程支持是可選的,爲了啓用它,您須要確保devtools
包含在從新打包的歸檔當中:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludeDevtools>false</excludeDevtools>
</configuration>
</plugin>
</plugins>
</build>
複製代碼
而後你須要設置一個spring.devtools.remote.secret
屬性,例如:
spring.devtools.remote.secret=mysecret
在遠程應用程序上啓用
spring-boot-devtools
存在安全風險。 您不該該在生產部署上啓用支持。
遠程devtools支持分爲兩部分, 即有一個接受鏈接的服務器端點以及您在IDE中運行的客戶端應用程序。 當設置了spring.devtools.remote.secret
屬性時,服務器組件會自動啓用。 客戶端組件必須手動啓動。
org.springframework.boot.devtools.RemoteSpringApplication
。 傳遞給應用程序的非選項(non-option
)參數應該是您要鏈接到的遠程URL。my-app
的項目部署到了Cloud Foundry,則能夠執行如下操做:
Run
菜單中選擇Run Configurations…
。Java Application
"launch configuration
"。my-app
項目。org.springframework.boot.devtools.RemoteSpringApplication
做爲主類。https://myapp.cfapps.io
添加到Program arguments
(或任何遠程URL)。. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | | _ \___ _ __ ___| |_ ___ \ \ \ \
\\/ ___)| |_)| | | | | || (_| []::::::[] / -_) ' \/ _ \ _/ -_) ) ) ) ) ' |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / /
=========|_|==============|___/===================================/_/_/_/
:: Spring Boot Remote :: 1.5.9.RELEASE
2015-06-10 18:25:06.632 INFO 14938 --- [ main] o.s.b.devtools.RemoteSpringApplication : Starting RemoteSpringApplication on pwmbp with PID 14938 (/Users/pwebb/projects/spring-boot/code/spring-boot-devtools/target/classes started by pwebb in /Users/pwebb/projects/spring-boot/code/spring-boot-samples/spring-boot-sample-devtools)
2015-06-10 18:25:06.671 INFO 14938 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2a17b7b6: startup date [Wed Jun 10 18:25:06 PDT 2015]; root of context hierarchy
2015-06-10 18:25:07.043 WARN 14938 --- [ main] o.s.b.d.r.c.RemoteClientConfiguration : The connection to http://localhost:8080 is insecure. You should use a URL starting with 'https://'.
2015-06-10 18:25:07.074 INFO 14938 --- [ main] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729
2015-06-10 18:25:07.130 INFO 14938 --- [ main] o.s.b.devtools.RemoteSpringApplication : Started RemoteSpringApplication in 0.74 seconds (JVM running for 1.105)
複製代碼
因爲遠程客戶端使用與實際應用程序相同的類路徑,所以能夠直接讀取應用程序屬性。 這就是如何讀取
spring.devtools.remote.secret
屬性並將其傳遞給服務器進行身份驗證。
https://
做爲鏈接協議,以便流量被加密且密碼不能被攔截!spring.devtools.remote.proxy.host
和spring.devtools.remote.proxy.port
屬性。只有遠程客戶端正在運行時纔會監視文件。 若是在啓動遠程客戶端以前更改文件,則更新操做不會將其推送到遠程服務器。
Java遠程調試在診斷遠程應用程序的問題時很是有用。 不幸的是,當您的應用程序部署在數據中心以外時,並不老是能夠啓用遠程調試。 若是您使用基於容器的技術(例如Docker),則遠程調試也可能會很是棘手。
爲了幫助解決這些限制,devtools支持經過HTTP隧道傳輸遠程調試流量。 遠程客戶端在端口8000
上提供本地服務器,您能夠將其附加到遠程調試器。 創建鏈接後,調試流量將經過HTTP發送到遠程應用程序。 若是你想使用不一樣的端口,你可使用spring.devtools.remote.debug.local-port
屬性。
您須要確保您的遠程應用程序在啓用遠程調試的狀況下啓動。 這一般能夠經過配置JAVA_OPTS
來實現。 例如,使用Cloud Foundry
,您能夠將如下內容添加到您的manifest.yml
中:
---
env:
JAVA_OPTS: "-Xdebug -Xrunjdwp:server=y,transport=dt_socket,suspend=n"
複製代碼
請注意,您不須要將
address=NNNN
選項傳遞給-Xrunjdwp
。 若是省略,Java將簡單地選取一個隨機空閒端口。
經過Internet調試遠程服務可能會很慢,您可能須要增長IDE中的超時時間。 例如,在Eclipse中,您能夠選擇
Java
→Preferences…``Debug
並將debug timeout(ms)
更改成更合適的值(在大多數狀況下,60000
的效果很好)。
在IntelliJ IDEA中使用遠程調試通道時,必須將全部斷點配置爲掛起線程而不是VM。 默認狀況下,IntelliJ IDEA中的斷點會暫停整個虛擬機,而不是僅掛起遇到斷點的線程。 這具備暫停管理遠程調試通道的線程的不良反作用,致使您的調試會話凍結。 在IntelliJ IDEA中使用遠程調試通道時,應將全部斷點配置爲掛起線程而不是VM。 請參閱IDEA-165769瞭解更多詳情。
jars
可用於生產部署。 因爲它們是獨立的,所以它們也很是適合基於雲的部署。spring-boot-actuator
。 有關詳細信息,請參閱第五部分「spring-boot-actuator:生產就緒功能」 。