javascript
SpringBoot之二:部署Spring Boot应用程序方式
衡量多種部署方式
Spring Boot應(yīng)用程序有多種構(gòu)建和運(yùn)行方式,其中一些你已經(jīng)使用過了。
- 在IDE中運(yùn)行應(yīng)用程序(涉及Spring ToolSuite或IntelliJ IDEA)。
- 使用Maven的spring-boot:run或Gradle的bootRun,在命令行里運(yùn)行。
- 使用Maven或Gradle生成可運(yùn)行的JAR文件,隨后在命令行中運(yùn)行。
- 使用Spring Boot CLI在命令行中運(yùn)行Groovy腳本。
- 使用Spring Boot CLI來生成可運(yùn)行的JAR文件,隨后在命令行中運(yùn)行。
這些選項每一個都適合運(yùn)行正在開發(fā)的應(yīng)用程序。但是,如果要將應(yīng)用程序部署到生產(chǎn)環(huán)境 或其他非開發(fā)環(huán)境中,又該怎么辦呢? 雖然這些選項看起來沒有一個能將應(yīng)用部署于非開發(fā)環(huán)境,但事實(shí)上,它們之中只有一個選 項不可用于生產(chǎn)環(huán)境——在IDE中運(yùn)行應(yīng)用顯然不可取。可運(yùn)行的JAR文件和Spring Boot CLI還是 可以考慮的,兩者還可以很好地將應(yīng)用程序部署到云環(huán)境里。 也許你很想知道如何把Spring Boot應(yīng)用程序部署到一個更加傳統(tǒng)的應(yīng)用服務(wù)器環(huán)境里,比如 Tomcat、WebSphere或WebLogic。在這些情境中,可執(zhí)行JAR文件和Groovy代碼不適用。針對應(yīng) 用服務(wù)器的部署,你需要將應(yīng)用程序打包成一個WAR文件。 實(shí)際上,Spring Boot應(yīng)用程序可以用多種方式打包,詳見表8-1。
如你所見,在做終選擇時需要考慮目標(biāo)環(huán)境。如果要將應(yīng)用程序部署到自己數(shù)據(jù)中心的 Tomcat服務(wù)器上,WAR文件就是你的選擇。另一方面,如果要部署到Cloud Foundry,可以使用 表里列出的各種選項。 本章將關(guān)注以下選項。
- 向Java應(yīng)用服務(wù)器里部署WAR文件。
- 向Cloud Foundry里部署可執(zhí)行JAR文件。
- 向Heroku里部署可執(zhí)行JAR文件(構(gòu)建過程是由Heroku執(zhí)行的)。
探索這些場景的時候,我們還要處理一件事。在開發(fā)應(yīng)用程序時我們使用了嵌入式的H2數(shù) 據(jù)庫,現(xiàn)在得把它替換成生產(chǎn)環(huán)境所需的數(shù)據(jù)庫了。 首先,讓我們看看如何將閱讀列表應(yīng)用程序構(gòu)建為WAR文件。這樣才能把它部署到Java應(yīng)用 服務(wù)器里,比如Tomcat、WebSphere或WebLogic。?
部署到應(yīng)用服務(wù)器
到目前為止,閱讀列表應(yīng)用程序每次運(yùn)行,Web應(yīng)用程序都通過內(nèi)嵌在應(yīng)用里的Tomcat提供 服務(wù)。情況和傳統(tǒng)Java Web應(yīng)用程序正好相反。不是應(yīng)用程序部署在Tomcat里,而是Tomcat部署 在了應(yīng)用程序里。 歸功于Spring Boot的自動配置功能,我們不需要創(chuàng)建web.xml文件或者Servlet初始化類來聲明Spring MVC的DispatcherServlet。但如果要將應(yīng)用程序部署到Java應(yīng)用服務(wù)器里,我們就需 要構(gòu)建WAR文件了。這樣應(yīng)用服務(wù)器才能知道如何運(yùn)行應(yīng)用程序。那個WAR文件里還需要一個 對Servlet進(jìn)行初始化的東西。?
構(gòu)建WAR文件 實(shí)際上,構(gòu)建WAR文件并不困難。如果你使用Gradle來構(gòu)建應(yīng)用程序,只需應(yīng)用WAR插件 即可:
apply plugin: 'war' 隨后,在build.gradle里用以下war配置替換原來的jar配置:
war { baseName = 'readinglist' version = '0.0.1-SNAPSHOT' } 兩者的唯一區(qū)別就是 j 換成了w。
如果使用Maven構(gòu)建項目,獲取WAR文件會更容易。只需把<packaging>元素的值從jar 改為war。
<packaging>war</packaging>這樣就能生成WAR文件了。
但如果WAR文件里沒有啟用Spring MVC DispatcherServlet 的web.xml文件或者Servlet初始化類,這個WAR文件就一無是處。 此時就該Spring Boot出馬了。它提供的SpringBootServletInitializer是一個支持 Spring Boot的Spring WebApplicationInitializer實(shí)現(xiàn)。除了配置Spring的Dispatcher- Servlet,SpringBootServletInitializer還會在Spring應(yīng)用程序上下文里查找Filter、 Servlet或ServletContextInitializer類型的Bean,把它們綁定到Servlet容器里。 要使用SpringBootServletInitializer,只需創(chuàng)建一個子類,覆蓋configure()方法 來指定Spring配置類。代碼清單8-1是ReadingListServletInitializer,也就是我們?yōu)殚喿x列表應(yīng)用程序?qū)懙腟pringBootServletInitializer的子類。
package com.dxz.demo;import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.context.web.SpringBootServletInitializer;public class ReadingListServletInitializer extends SpringBootServletInitializer {@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {return builder.sources(DemoApplication.class); //指定spring配置 }}如你所見,configure()方法傳入了一個SpringApplicationBuilder參數(shù),并將其作為 結(jié)果返回。期間它調(diào)用sources()方法注冊了一個Spring配置類。本例只注冊了一個 Application類。回想一下,這個類既是啟動類(帶有main()方法),也是一個Spring配置類。
雖然閱讀列表應(yīng)用程序里還有其他Spring配置類,但沒有必要在這里把它們?nèi)孔赃M(jìn)來。 Application類上添加了@SpringBootApplication注解。這會隱性開啟組件掃描,而組件掃 描則會發(fā)現(xiàn)并應(yīng)用其他配置類。 現(xiàn)在我們可以構(gòu)建應(yīng)用程序了。如果使用Gradle,你只需調(diào)用build任務(wù)即可:
$ gradle build 沒問題的話,你可以在build/libs里看到一個名為readinglist-0.0.1-SNAPSHOT.war的文件。 對于基于Maven的項目,可以使用package:
$ mvn package 成功構(gòu)建之后,你可以在target目錄里找到WAR文件。 剩下的工作就是部署應(yīng)用程序了。應(yīng)用服務(wù)器不同,部署過程會有所區(qū)別,因此請參考應(yīng)用 服務(wù)器的部署說明文檔。
對于Tomcat而言,可以把WAR文件復(fù)制到Tomcat的webapps目錄里。如果Tomcat正在運(yùn)行(要 是沒有運(yùn)行,則在下次啟動時檢測),則會檢測到WAR文件,解壓并進(jìn)行安裝。 假設(shè)你沒有在部署前重命名WAR文件, Servlet上下文路徑會與WAR文件的主文件名相同, 在本例中是/demo-0.0.1-SNAPSHOT。用你的瀏覽器打開http://server:port/demo-0.0.1-SNAPSHOT就能訪問應(yīng)用程序了。?
?
還有一點(diǎn)值得注意:就算我們在構(gòu)建的是WAR文件,這個文件仍舊可以脫離應(yīng)用服務(wù)器直 接運(yùn)行。如果你沒有刪除Application里的main()方法,構(gòu)建過程生成的WAR文件仍可直接運(yùn) 行,一如可執(zhí)行的JAR文件:?
E:\myspace\demo\target>java -jar demo-0.0.1-SNAPSHOT.war
?
總結(jié)
以上是生活随笔為你收集整理的SpringBoot之二:部署Spring Boot应用程序方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 中一个中文所占字节
- 下一篇: 出来工作五年的经历总结(五年前,你在干嘛