SpringBoot手动部署到Tomcat和自动化热部署

前言:

在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中修改:

    war

 

2.移除嵌入式tomcat插件

在pom.xml里找到spring-boot-starter-web依赖节点,将其修改成如下:


			org.springframework.boot
			spring-boot-starter-web
			 
				
					org.springframework.boot
					spring-boot-starter-tomcat
				
			
		

因为spring-boot-starter-web中依赖了spring-boot-starter-tomcat,而我们现在是使用服务器上的tomcat,自然要排除这个默认的,所以为了让打包的war包小一些,添加如上代码

 

3.添加servlet依赖


			javax.servlet
			javax.servlet-api
			provided
		

 

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 ,在最后加上如下内容




 

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,如下图:

SpringBoot手动部署到Tomcat和自动化热部署_第1张图片

然后重启下tomcat,访问下http://serverip:port/manager/html试试,若配置正确,应该能访问该页面

 

3.在pom.xml文件下加入插件


			
				org.apache.tomcat.maven
				tomcat7-maven-plugin
				
					8082
					http://xxx.xx.xx.xx:8082/manager/text
					kevin
					123456
					/webapp   
					true
				
			
		

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

 

4.部署

如果是第一次部署,运行mvn tomcat7:deploy进行自动部署(对于tomcat8,9,也是使用tomcat7命令),如果是更新了代码后重新部署更新,运行mvn tomcat7:redeploy。

如果第一次部署使用mvn tomcat7:redeploy,则只会执行上传war文件,服务器不会自动解压部署。如果路径在tomcat服务器中已存在并且使用mvn tomcat7:deploy命令的话,上面的配置中一定要配置true,不然会报错。

 

部署后访问下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,如下图

SpringBoot手动部署到Tomcat和自动化热部署_第2张图片

 

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   

 

你可能感兴趣的:(JavaWeb,SpringBoot,Tomcat)