目 录CONTENT

文章目录

SpringBoot项目使用WAR构建打包发布到外部服务器

Jinty
2023-12-24 / 0 评论 / 0 点赞 / 25 阅读 / 3520 字

引言

spring-boot-starter-web内置了web服务器,默认Tomcat:也可以很方便地替换默认的Tomcat,使得项目可以直接编译构建为jar包并使用java -jar 命令直接运行启动,

然而,有的时候项目需要放在外部的服务容器中运行,这时候该怎么实现呢?

jar包和war包启动区别:

  •  jar包:执行SpringBootApplication的run方法,启动IOC容器,然后创建嵌入式Servlet容器

  • war包:  先是启动Servlet服务器,服务器启动Springboot应用(springBootServletInitizer),然后启动IOC容器

实现方式

以Maven构建的一般性Web项目为例,

  1. 修改pom.xml配置,设置打包方式为war

<packaging>war</packaging>
  1. 修改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的时候不用将对应的依赖打包。

  1. 重写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;
    }

}

0

评论区