Spring Boot 的Maven多模組開發web項目使用外部容器進行部署,springmaven
Spring Boot中內建有Tomcat容器,因此Spring Boot項目只需要運行main函數,就可以運行,但是以往的web項目,我們習慣於使用自己安裝的Tomcat運行或者使用Tomcat、Jetty外掛程式來運行項目,方便簡單,同時部署也是簡單,只需要把產生的war包放在Tomcat的webapps下面,然後重啟Tomcat,就可以訪問項目了。那麼Spring Boot想通過上面的方式部署和訪問,應該如何操作呢?
其實主要的思路就是把Spring Boot內建的Tomcat屏蔽掉,然後引入新的Tomcat,這樣就可以了,也就達到了使用Spring Boot輕鬆開發web項目,簡單部署了。
本文的項目是基於Maven的多模組開發的,因此需要有一點這個基礎,如果還不太瞭解看一下這篇部落格http://www.cnblogs.com/advancing/category/1123469.html
具體的使用外部容器部署的實現方式如下:
1.在父級中設定以下配置
<!-- 這裡指定打包的時候不再需要tomcat相關的包 更改打war包加入的配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
父級pom中添加Tomcat、Jetty外掛程式,子模組中才會繼承,之後再根據子模組的特性去重新修改外掛程式參數,如連接埠、編碼....
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<!--如果在這設定屬性(port、path),模組的path就不起作用了-->
<configuration>
<uriEncoding>UTF-8</uriEncoding>
<!--<port>9080</port>-->
<!--<path>/</path>-->
</configuration>
</plugin>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>${jetty-version}</version>
<configuration>
<jvmArgs>-Dfile.encoding=UTF-8</jvmArgs>
</configuration>
</plugin>
<!--surefire-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
2.在子模組中建立一個和Spring Boot含有main方法的類同級的一個修改啟動類的方法
/**
* 修改啟動類,繼承 SpringBootServletInitializer 並重寫 configure 方法
* Created by kk on 2017/11/21.
*/
public class SpringBootStartApplication extends SpringBootServletInitializer {
@Override
public SpringApplicationBuilder configure(SpringApplicationBuilder builder){
return builder.sources(含有Main方法的類名.class);
}
}
3.子模組pom中添加打包所依賴的外掛程式,以及Tomcat、Jetty外掛程式。
<plugins>
<!--spring-boot為了保護application.yml和application.properties,修改了預設的預留位置${...}為@...@-->
<!--為了spring boot的yml和properties檔案能夠使用maven變數替換,使用${}預留位置-->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>utf-8</encoding>
<useDefaultDelimiters>true</useDefaultDelimiters>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--指定該Main Class為全域的唯一入口-->
<mainClass>cn.XX.wechat.authorization.XXWechatAuthorizationCloudApplication</mainClass>
<layout>ZIP</layout>
</configuration>
<executions>
<execution>
<goals>
<!--可以把依賴的包都打包到產生的Jar包中-->
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 這個配置是打包war包需要的 maven打包的時候告訴maven不需要web.xml,否剛會報找不到web.xml錯誤 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<!--<version>2.4</version>-->
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- Tomcat啟動 直接存取http://localhost:8080/ -->
<!--<url>http://localhost:8080/</url>-->
<!--<server>tomcat</server>-->
<!--<username>manager</username>-->
<!--<password>manager.123</password>-->
<!--<path>/</path>-->
<uriEncoding>UTF-8</uriEncoding>
<path>/${project.module.name}</path>
<port>8866</port>
</configuration>
</plugin>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>${jetty-version}</version>
<configuration>
<jvmArgs>-Dfile.encoding=UTF-8</jvmArgs>
<systemProperties>
<systemProperty>
<name>jetty.port</name>
<value>9083</value>
</systemProperty>
<systemProperty>
<name>org.eclipse.jetty.server.Request.maxFormContentSize</name>
<value>-1</value>
</systemProperty>
</systemProperties>
<stopKey>stop</stopKey>
<stopPort>5599</stopPort>
<webAppConfig>
<contextPath>/${project.module.name}</contextPath>
<parentLoaderPriority>true</parentLoaderPriority>
</webAppConfig>
<scanIntervalSeconds>0</scanIntervalSeconds>
</configuration>
</plugin>
</plugins>
4.這樣在本地就可以運用自己配置的容器運行了,成功之後子模組會有以下標誌。
5.如果需要對子模組發布到生產上,需要子模組設定packaging為war,在父模組先mvn install(因為對其他模組有依賴),然後在mvn package,之後將產生的war包放在生產就OK了。
延伸一點:
使用Spring Boot內建的Tomcat開發,不做如上操作,該如何部署Spring Boot項目呢,有兩種方式:
一:將Spring Boot項目產生一個jar包,然後通過。
1.cmd進入到Spring Boot項目打包成的jar檔案目錄
2.運行java -jar 項目jar名.jar
3.訪問項目中定義的路徑
二:通過Docker來部署。