带有外部Tomcat的Spring Boot

在本文中,我将如何在外部Tomcat上运行Spring Boot应用程序。对我来说,这是一个现实的场景,我必须解决这个问题,因此也请教了一下优锐课老师,得到了很多帮助。也希望当你遇到类似问题时,能为你提供一些有用的信息。

让我们看看从头开始一个项目时可能会遇到的一些常见问题。

Spring Boot启动方法

使用Spring Boot的主要优点之一是可以使用内置的嵌入式Tomcat轻松设置Web应用程序。默认情况下,自动配置器使用Tomcat设置你的项目。你只需点击运行按钮,你的Web服务器就会启动你的应用程序。在application.yaml或属性文件中,你可以像下面这样轻松地配置此Tomcat服务器:

server:
   port: 9091 //set the port number of our running application
   servlet:
      context-path: /springapplication /set the context path of our application

要运行我们的应用程序,我们只需要一个主方法:

@SpringBootApplication
public class App 
{
    public static void main( String[] args )
    {
    SpringApplication.run(App.class, args);
    }
}

在这里插入图片描述

外部Tomcat的问题

可以期望应用程序在外部Tomcat服务器上运行。通常,它的发生是由于运营基础架构。此时,出现了一些问题。你的Spring Boot应用程序不会仅仅通过将其部署到网络服务器来启动。有以下几个原因:

• 默认情况下,Spring Boot创建一个.jar文件作为输出。Tomcat需要一个.war文件。

• 在Tomcat环境中,你不想使用嵌入式服务器。

• Tomcat服务器不会使用你的主要方法。因此,你需要以普通的Spring应用程序启动你的应用程序。

Spring Boot是一项尖端技术,主要支持在容器化环境中运行。如果你想以标准方式操作应用程序,该怎么办?

首先,你可以返回通常不想要的本机Spring。其次,你可以进行一些修改,以使你的应用程序准备在老式Tomcat服务器上运行。 所以,我会告诉你如何。
在这里插入图片描述

使用外部Tomcat运行Spring Boot

首先,你需要在pom.xml中进行一些修改:
为artifact设置war packaging:

<packaging>war</packaging>

设置Tomcat服务器依赖项以提供:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

如果你的某些Spring Boot库默认包含它,请排除它:

<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>

最后,这就是窍门:修改应用程序的默认类:

@SpringBootApplication
public class App extends SpringBootServletInitializer
{
    public static void main( String[] args )
    {
    SpringApplication.run(App.class, args);
    }
}

SpringBootServerInitializer类执行以下操作(从原始类头中获取):

  • An opinionated {@link WebApplicationInitializer} to run a {@link SpringApplication} from a traditional WAR deployment. Binds {@link Servlet}, {@link Filter} and {@link ServletContextInitializer} beans from the application context to the server.
  • To configure the application either override the {@link #configure(SpringApplicationBuilder)} method (calling {@link SpringApplicationBuilder#sources(Class…)}) or make the initializer itself a {@code @Configuration}. If you are using {@link SpringBootServletInitializer} in combination with other {@link WebApplicationInitializer WebApplicationInitializers} you might also want to add an {@code @Ordered} annotation to configure a specific startup order.
  • Note that a WebApplicationInitializer is only needed if you are building a war file and deploying it. If you prefer to run an embedded web server then you won’t need this at all.

完成这些修改后,你将能够从传统的war部署中运行你的应用程序。

Tomcat上的Spring Boot App的外部配置

通常可以从IT部门可以轻松处理它的外部来源读取配置文件。
为此,你需要在主类中覆盖上述类中的configure方法。
在下面的示例中,我带来了一个实时示例。在这里,我需要从环境变量中读取配置路径。他们在Tomcat的服务器setenv.sh文件中进行设置。

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
String configLocation = System.getProperty("global.appconf.dir"); //get the default config directory location
    String configPath = configLocation + File.separator + "springApplication"  + File.separator + "application.yml"; //set the configpath of this application instance exclusively
    log.info("Configpath: " + configPath);
    log.info("Starting to run Spring boot app...");
    if(configLocation != null && !configLocation.isEmpty()) {
    Properties props = new Properties();
    props.setProperty("spring.config.location", configPath); //set the config file to use    
    application.application().setDefaultProperties(props);
    }else{
    log.info("No global.appconf.dir property found, starting with default on classpath");
    }
return application.sources(SpringApplication.class);
}

请注意,在外部Tomcat上运行时,配置文件中服务器节点下的设置不会生效。这些属性仅影响嵌入式Tomcat。

今天的分享就这些了,眼熟的小伙伴可以加Java学习资料交流qq群:907135806 一起学习Java。最近我也在努力往架构方向学习,特别感谢的是优锐课教育的老师对我的帮助,不但提供了系统丰富的资料,像JVM、Mysql、Tomcat、Spring Boot、Spring Cloud、Zookeeper、Kafka、RabbitMQ、RockerMQ、Redis、ELK、Git学习资料和视频课程都有,最重要的是老师提供的Java架构学习路线确实给我指明了学习路径,更有规划和效率,大家如果也有需要的话也可以加老师vx:ddmsiqi,共同进步~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Spring Boot部署应用到外部Tomcat中时,可能会遇到乱码的问题。导致乱码的原因可以有多种,下面将介绍一些常见的解决方法。 1. 配置Tomcat的URI编码:在Tomcat的server.xml配置文件中,找到Connector标签,添加URIEncoding="UTF-8",确保Tomcat使用UTF-8编码解析URI。 2. 配置Tomcat的请求体编码:在Tomcat的server.xml配置文件中,找到Connector标签,添加useBodyEncodingForURI="true",确保Tomcat使用请求体的编码来处理URI。 3. 配置Spring Boot的字符编码:在Spring Boot的配置文件(如application.properties)中,添加如下配置: server.tomcat.uri-encoding=UTF-8 spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true 这些配置将确保Spring Boot使用UTF-8编码来处理请求和响应。 4. 配置Spring Boot的过滤器:在Spring Boot的配置类中,添加一个过滤器来处理字符编码。例如,可以创建一个FilterRegistrationBean,并将CharacterEncodingFilter添加到其中: @Bean public FilterRegistrationBean characterEncodingFilter() { FilterRegistrationBean registrationBean = new FilterRegistrationBean(); CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); filter.setForceEncoding(true); registrationBean.setFilter(filter); return registrationBean; } 该过滤器将确保请求和响应的字符编码为UTF-8。 以上是一些常见的解决方法,根据具体情况选择适合的方法来解决乱码问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值