Статьи

Весенний ботинок с внешним Tomcat

За последние несколько месяцев я исчез. Причина в том, что я начал очень захватывающий проект, который стал настоящим испытанием. Поэтому я не мог позаботиться о своем блоге, но сейчас я здесь и хотел бы поделиться с вами своим опытом. Давайте рассмотрим наиболее распространенные проблемы, с которыми вы сталкиваетесь при запуске проекта с нуля, в частности, как запустить приложение Spring Boot с внешним Tomcat.

Весенний подход к загрузке

В моей статье о Spring Boot я написал об основных принципах работы этой технологии и о преимуществах, которые она имеет по сравнению с базовой платформой.

Одним из основных преимуществ использования Spring Boot является возможность простой настройки ваших веб-приложений с помощью встроенного встроенного Tomcat. По умолчанию автоконфигуратор настраивает ваш проект с Tomcat. Вы просто нажимаете кнопку запуска, и ваш веб-сервер запускается с вашим приложением. В файле 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);
    }
}

Если вы не знакомы с тем, как создать отдельное приложение Spring Boot, ознакомьтесь с моей статьей, в которой подробно рассказывается о том, как я проходил основы.

Проблема с пружинным ботинком с внешним котом

Проблема с внешним Tomcat

Это может быть общее ожидание запуска приложения на внешнем сервере Tomcat. Обычно это происходит из-за операционной инфраструктуры. На этом этапе возникают некоторые проблемы. Ваше приложение Spring Boot не запустится, просто развернув его на веб-сервере . У этого есть несколько причин:

  • По умолчанию Spring Boot создает файл .jar в качестве вывода. Tomcat нужен файл .war.
  • В среде Tomcat вы не хотели бы использовать встроенный сервер.
  • Сервер Tomcat не использует ваш основной метод. Следовательно, вам нужно запустить ваше приложение как обычное приложение Spring.

Spring Boot — это передовая технология, которая в основном поддерживает работы в контейнерах. Что вы можете сделать, если вы хотите работать со своим приложением стандартным способом?

Во-первых, вы можете вернуться к родной весне, которую вы обычно не хотите. Во-вторых, вы можете внести некоторые изменения, которые подготовят ваше приложение для запуска на старом школьном сервере Tomcat. Итак, я покажу вам, как.

Запуск весенней загрузки с внешним котом

Запуск весеннего ботинка с внешним Tomcat

Во-первых, вам нужно внести некоторые изменения в ваш pom.xml:

Установите военную упаковку для своего артефакта:

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

После внесения этих изменений вы сможете запустить свое приложение из традиционного военного развертывания.


Внешняя настройка вашего приложения Spring Boot на Tomcat

Это может быть общее ожидание прочитать ваш файл конфигурации из внешнего источника, где ИТ-операция может легко с этим справиться.

Для этого вам необходимо переопределить метод configure из упомянутого выше класса в нашем основном классе.

В следующем примере я привел пример в реальном времени. Здесь мне нужно было прочитать путь конфигурации из переменной среды. Они установили его в файле setenv.sh сервера Tomcat .

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

Резюме

В этой статье я продемонстрировал, как вы можете запустить приложение Spring Boot на внешнем Tomcat. Для меня это был реальный сценарий, в котором я должен был решить эту проблему. 

Надеемся, что это даст некоторую полезную информацию, когда вы столкнетесь с подобной проблемой. Если вам понравился мой пост, не забудьте поделиться!

Наконец, для более глубокого знания, я рекомендую вам прочитать официальную документацию Spring здесь .