SpringBoot手動部署到Tomcat和自動化熱部署

Bird鳥人發表於2019-03-07

前言:

在Eclipse中使用springboot專案,執行只需要直接右鍵預設的啟動類DemoApplication.java  ,Run As -->Spring Boot App即可。

但是我們想把專案的war包部署到伺服器的tomcat中,那麼就必須做一些修改

 

 

部署到tomcat

環境:

本地:Eclipse、SpringBoot2.1.2、Maven
伺服器:CentOs7  JDK1.8  Tomcat9.10

1.修改打包方式為war

在pom.xml中修改:

    <packaging>war</packaging>

 

2.移除嵌入式tomcat外掛

在pom.xml裡找到spring-boot-starter-web依賴節點,將其修改成如下:

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			 <exclusions>
				<exclusion>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-starter-tomcat</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

因為spring-boot-starter-web中依賴了spring-boot-starter-tomcat,而我們現在是使用伺服器上的tomcat,自然要排除這個預設的,所以為了讓打包的war包小一些,新增如上程式碼

 

3.新增servlet依賴

<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<scope>provided</scope>
		</dependency>

 

4.我們需要類似於web.xml的配置方式來啟動spring上下文,在DemoApplication類的同級新增一個SpringBootStartApplication類,繼承SpringBootServletInitializer。其程式碼如下: 

public class SpringBootStartApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        // 注意這裡要指向原先用main方法執行的Application啟動類
        return builder.sources(DemoApplication.class);
    }  

}

5. 打包部署
在專案根目錄下(即包含pom.xml的目錄),在命令列裡輸入: mvn clean package,或者專案右鍵Run As ->Maven install
然後把target目錄下的war包放到tomcat的webapps目錄下,啟動tomcat
訪問:http://localhost:[埠號]/[打包專案名]/

注意:這個打包專案名是指你的war包名稱,一般我們會編成xxxServer-0.0.1-SNAPSHOT, 所以訪問路徑為:

http://ip:8080/xxxServer-0.0.1-SNAPSHOT/xxx

 

 

 

如果需要在springboot中加上request字首,需要在application.properties或者application.yml中新增server.contextPath=/prefix/即可。其中prefix為字首名。

但是這個字首會在war包中失效,取而代之的是war包名稱(類似於xxxServer-0.0.1-SNAPSHOT),如果war包名稱和prefix相同的話,那麼除錯環境和正式部署環境就是一個request地址了

 

 

 

 

配置自動化部署

上面的方法只是打包war包,每次都要受到上傳tomcat,並重啟tomcat。過於繁瑣.
我們使用tomcat的maven外掛完成自動部署,和這篇文章類似,可以參考:https://blog.csdn.net/wcc27857285/article/details/82768550

 

1.修改伺服器上tomcat/conf/tomcat-user.xml ,在最後加上如下內容

<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="admin" password="password" roles="manager-script"/>
<user username="root" password="password" roles="manager-gui"/>

 

2.修改tomcat/webapps/manager/META-INF/context.xml

因為tomcat的manager頁面是預設只能本機訪問,所以還需要修改下usr/local/tomcat/webapps/manager/META-INF/context.xml 配置檔案

將Context節點下的Value節點註釋即可 

或者加入你的本地機器的ip:101.71.45.321,如下圖:

然後重啟下tomcat,訪問下http://serverip:port/manager/html試試,若配置正確,應該能訪問該頁面

 

3.在pom.xml檔案下加入外掛

<plugins>
			<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<configuration>
					<port>8082</port>
					<url>http://xxx.xx.xx.xx:8082/manager/text</url>
					<username>kevin</username>
					<password>123456</password>
					<path>/webapp</path>   <!-- 應用的部署位置 -->
					<update>true</update>
				</configuration>
			</plugin>
		</plugins>

username 和password和tomcat-user.xml中配置的一致

 

4.部署

如果是第一次部署,執行mvn tomcat7:deploy進行自動部署(對於tomcat8,9,也是使用tomcat7命令),如果是更新了程式碼後重新部署更新,執行mvn tomcat7:redeploy。

如果第一次部署使用mvn tomcat7:redeploy,則只會執行上傳war檔案,伺服器不會自動解壓部署。如果路徑在tomcat伺服器中已存在並且使用mvn tomcat7:deploy命令的話,上面的配置中一定要配置<update>true</update>,不然會報錯。

 

部署後訪問下http://serverip:port/[專案名]   ,成功!

 

 

 

遇到的問題:

eclipse-->run as -->maven install
報錯:No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

提示找不到能改編譯的工具,編譯必須用到開發工具,也就是jdk,jre是執行環境,並不具備編譯功能。

解決方法:專案右鍵--> build path --> libraries -->選擇jre -->edit-->選擇jdk,如下圖

 

2.eclipse -->run as ->maven build-> tomcat7:deploy   時報錯

[INFO] --- tomcat7-maven-plugin:2.2:deploy (default-cli) @ RestApi ---
[INFO] Deploying war to http://localhost:8080/  
Uploading: http://localhost:8080/manager/text/deploy?path=%2F
[INFO] I/O exception (java.net.SocketException) caught when processing request: Connection reset by peer: socket write error
 

這個是因為在webapps下已經存在了這個專案。無法執行覆蓋更新命令,需要執行redeploy命令才可以覆蓋更新。或者執行undeploy先解除安裝存在的專案,然後再執行deploy即可。

 

3.eclipse -->run as ->maven build-> tomcat7:deploy   

 

相關文章