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