欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

带有外部Tomcat的Spring Boot

程序员文章站 2022-07-09 21:52:28
在本文中,我将如何在外部Tomcat上运行Spring Boot应用程序。对我来说,这是一个现实的场景,我必须解决这个问题,因此也请教了一下优锐课老师,得到了很多帮助。也希望当你遇到类似问题时,能为你提供一些有用的信息。 让我们看看从头开始一个项目时可能会遇到的一些常见问题。 Spring Boot ......

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

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

 

spring boot启动方法

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

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

 

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

1 @springbootapplication
2 public class app 
3 {
4     public static void main( string[] args )
5     {
6     springapplication.run(app.class, args);
7     }
8 }

 带有外部Tomcat的Spring Boot

 

 

 

外部tomcat的问题

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

  • 默认情况下,spring boot创建一个.jar文件作为输出。tomcat需要一个.war文件。
  • 在tomcat环境中,你不想使用嵌入式服务器。
  • tomcat服务器不会使用你的主要方法。因此,你需要以普通的spring应用程序启动你的应用程序。

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

首先,你可以返回通常不想要的本机spring。其次,你可以进行一些修改,以使你的应用程序准备在老式tomcat服务器上运行。 所以,我会告诉你如何。

 带有外部Tomcat的Spring Boot

 

 

 

使用外部tomcat运行spring boot

首先,你需要在pom.xml中进行一些修改:

为artifact设置war packaging:

1 <packaging>war</packaging>


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

1        <dependency>
2             <groupid>org.springframework.boot</groupid>
3             <artifactid>spring-boot-starter-tomcat</artifactid>
4             <scope>provided</scope>
5         </dependency>

 

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

 1 <dependency>
 2 <groupid>org.springframework.boot</groupid>
 3 <artifactid>spring-boot-starter-web</artifactid>
 4             <exclusions>
 5                 <exclusion>
 6                     <groupid>org.springframework.boot</groupid>
 7                     <artifactid>spring-boot-starter-tomcat</artifactid>
 8                 </exclusion>
 9             </exclusions>
10 </dependency>

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

1 @springbootapplication
2 public class app extends springbootservletinitializer
3 {
4     public static void main( string[] args )
5     {
6     springapplication.run(app.class, args);
7     }
8 }

 

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

1  * 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.
2  * 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.
3  * 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

 

 

 

tomcat上的spring boot app的外部配置

通常可以从it部门可以轻松处理它的外部来源读取配置文件。

为此,你需要在主类中覆盖上述类中的configure方法。

在下面的示例中,我带来了一个实时示例。在这里,我需要从环境变量中读取配置路径。他们在tomcat的服务器setenv.sh文件中进行设置。

 1 @override
 2 protected springapplicationbuilder configure(springapplicationbuilder application) {
 3 string configlocation = system.getproperty("global.appconf.dir"); //get the default config directory location
 4     string configpath = configlocation + file.separator + "springapplication"  + file.separator + "application.yml"; //set the configpath of this application instance exclusively
 5     log.info("configpath: " + configpath);
 6     log.info("starting to run spring boot app...");
 7     if(configlocation != null && !configlocation.isempty()) {
 8     properties props = new properties();
 9     props.setproperty("spring.config.location", configpath); //set the config file to use    
10     application.application().setdefaultproperties(props);
11     }else{
12     log.info("no global.appconf.dir property found, starting with default on classpath");
13     }
14 return application.sources(springapplication.class);
15 }

 

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