前言:
在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