引言
spring-boot-starter-web
内置了web服务器,默认Tomcat
:也可以很方便地替换默认的Tomcat
,使得项目可以直接编译构建为jar包并使用java -jar
命令直接运行启动,
然而,有的时候项目需要放在外部的服务容器中运行,这时候该怎么实现呢?
jar包和war包启动区别:
jar包:执行SpringBootApplication的run方法,启动IOC容器,然后创建嵌入式Servlet容器
war包: 先是启动Servlet服务器,服务器启动Springboot应用(springBootServletInitizer),然后启动IOC容器
实现方式
以Maven构建的一般性Web项目为例,
修改pom.xml配置,设置打包方式为
war
<packaging>war</packaging>
修改pom.xml配置,将内置tomcat依赖作用范围声明为
provided
(即外部已提供)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
provided
的作用就是在mvn package的时候不用将对应的依赖打包。
重写SpringBootServletInitializer
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
public class EvaCdessServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(EvaCdessApplication.class);
}
}
如果是使用Nacos,服务在tomcat运行的端口配置和项目配置文件不一致,可能会发现服务无法注册
可以配置spring.cloud.nacos.discovery.port
@Slf4j
@Configuration
public class NacosConfig implements ApplicationRunner {
@Value("${server.port}")
Integer port;
@Autowired(required = false)
private NacosAutoServiceRegistration registration;
@Override
public void run(ApplicationArguments args) throws Exception {
if (registration != null && port != null) {
Integer tomcatPort = port;
try {
tomcatPort = new Integer(getTomcatPort());
} catch (Exception e) {
}
registration.setPort(tomcatPort);
registration.start();
}
}
/**
* 获取外部tomcat端口
*/
public String getTomcatPort() throws Exception {
MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();
Set<ObjectName> objectNames = beanServer.queryNames(new ObjectName("*:type=Connector,*"),
Query.match(Query.attr("protocol"), Query.value("org.apache.coyote.http11.Http11AprProtocol")));
String port = objectNames.iterator().next().getKeyProperty("port");
log.info("Tomcat config port: " + port);
return port;
}
}
评论区