Подтвердить что ты не робот

Spring Загрузочная война, развернутая в Tomcat

Я пытаюсь развернуть приложение загрузки Spring для Tomcat, потому что я хочу развернуть в AWS. Я создал WAR файл, но, похоже, он не работает на Tomcat, хотя это видно.

Детали:
0. Вот мое приложение:

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

@Controller
@EnableAutoConfiguration
public class SampleController {
    @RequestMapping("/help")
    @ResponseBody
    String home() {
        String input = "Hi! Please use 'tag','check' and 'close' resources.";
        return input;
    }
}

application.properties имеет следующие значения:

server.port=${port:7777}
  • После прочтения ряда страниц и вопрос-ответы я добавлено в мой POM:

    http://maven.apache.org/xsd/maven-4.0.0.xsd" >   4.0.0

    <groupId>com.niewlabs</groupId>
    <artifactId>highlighter</artifactId>
    <version>1.0-SNAPSHOT</version>
    
    <packaging>war</packaging>
    
    <properties>
        <java.version>1.8</java.version>
    </properties>    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.1.9.RELEASE</version>
    </parent>    
    <dependencies>
        <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>
    </dependencies>
    

  • Я запускал "mvn package" и получил WAR файл (размер 250Mb), который я ввел в папку "webapps".

  • Я начал Tomcat и смог увидеть мое приложение в моем случае "/highlighter-1.0-SNAPSHOT".
  • При нажатии на ссылку для приложения появляется страница "Статус 404".
  • Когда я запускаю приложение Spring Boot только сам по себе, без контейнера он запускается на localhost: 7777, но там нет ничего, когда я запускаю его в Tomcat.

Обновление: Существует еще один reference. Не уверен, насколько он полезен.

4b9b3361

Ответ 1

В этом руководстве подробно объясняется, как развернуть приложение Spring Boot на Tomcat:
http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war-file

По существу мне нужно было добавить следующий класс:

public class WebInitializer extends SpringBootServletInitializer {   
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(App.class);
    }    
}

Также я добавил следующее свойство в POM:

<properties>        
    <start-class>mypackage.App</start-class>
</properties>

Ответ 2

Я думаю, что вас путают разные парадигмы. Во-первых, военные файлы и развертывание серверов - эти вещи принадлежат Java Enterprise Edition (Java EE). Эти понятия не имеют реального места в приложении spring -boot, которое следует за другой моделью.

Spring -boot отвечает за создание встроенного контейнера и запуск ваших сервисов внутри него непосредственно из стандартных файлов jar (хотя он может сделать намного больше). Я думаю, что цель этой модели заключается в поддержке развития микросервиса - где каждая служба имеет свой собственный контейнер и полностью автономна. Вы можете использовать свой код для создания приложений Java EE, но это было бы глупо, учитывая, что spring -boot намного проще (для определенных типов приложений/сервисов).

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

Spring -boot - исполняемый файл - вам просто нужно запустить основной метод в классе приложения, который вы можете сделать из командной строки или с помощью вашей любимой среды IDE или maven или gradle (tip: maven is right ответ). Это приведет к появлению сервера tomcat (по умолчанию), и ваш сервис будет доступен в нем. Учитывая, что вы разместили выше, ваша служба должна быть доступна по адресу: http://localhost:7777/context/help - context предназначен для замены на ваше имя контекста, которое вы не использовали.

Вы не должны создавать войну, запускать tomcat или развертывать что-либо. Ничего из этого не требуется в spring -boot. Упаковка в вашем pom должна быть jar, а не war, а scope spring-boot-starter-tomcat должна быть удалена - она, конечно же, не предоставляется.

Когда вы запускаете свой основной метод, на выходе консоли должен указываться контекст, который вы зарегистрировали; используйте это для правильного URL.

Сказав все это, spring -boot должен существовать в мире JEE на данный момент (пока он не будет широко принят). По этой причине люди spring задокументировали подход к построению войны, а не к исполняемому банку, для развертывания в сервлете или контейнере JEE. Это позволяет использовать много технологий spring -boot в средах, где существуют ограничения на использование чего-либо, кроме войн (или ушей). Однако это всего лишь ответ на тот факт, что такие среды довольно распространены и не рассматриваются как необходимая или даже желательная часть решения.

Ответ 3

Эй, обязательно сделайте это, измените на pom.xml

<packaging>war</packaging>

в разделе зависимостей обязательно укажите, что tomcat предоставлен, поэтому вам не нужен встроенный плагин tomcat.

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

    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>       

Это весь pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <start-class>com.example.Application</start-class>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

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

        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>       

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

И класс приложения должен выглядеть следующим образом:

Application.java

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;

@SpringBootApplication
public class Application extends SpringBootServletInitializer {


    /**
     * Used when run as JAR
     */
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    /**
     * Used when run as WAR
     */
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Application.class);
    }

}

И вы можете добавить контроллер для тестирования MyController.java

package com.example;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MyController {

    @RequestMapping("/hi")
    public @ResponseBody String hiThere(){
        return "hello world!";
    }
}

Затем вы можете запустить проект в версии tomcat 8 и получить доступ к контроллеру, подобному этому

http://localhost:8080/demo/hi

Если по какой-то причине вы не можете добавить проект в tomcat, сделайте правый щелчок в проекте, а затем перейдите к пути сборки → configure build path- > Project Faces

убедитесь, что выбраны только эти 3

Динамический веб-модуль 3.1 Java 1.8 Javascript 1.0

Ответ 4

Ваш класс Application.java должен расширить класс SpringBootServletInitializer например:

public class Application extends SpringBootServletInitializer {}

Ответ 5

Решение для людей, использующих Gradle

Добавить плагин в build.gradle

apply plugin: 'war'

Добавить при условии зависимости от tomcat

dependencies {
    // other dependencies
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}

Ответ 6

После выполнения руководства (или с помощью Spring Initializr) у меня была WAR, которая работала на моем локальном компьютере, но не работала удаленно (работает на Tomcat).

Не было сообщения об ошибке, он просто сказал, что был найден "инициализатор сервлета Spring", но ничего не сделал.

17-Aug-2016 16:58:13.552 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.5.4
17-Aug-2016 16:58:13.593 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive /opt/tomcat/webapps/ROOT.war
17-Aug-2016 16:58:16.243 INFO [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.

и

17-Aug-2016 16:58:16.301 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log 2 Spring WebApplicationInitializers detected on classpath
17-Aug-2016 16:58:21.471 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Initializing Spring embedded WebApplicationContext
17-Aug-2016 16:58:25.133 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log ContextListener: contextInitialized()
17-Aug-2016 16:58:25.133 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log SessionListener: contextInitialized()

Ничего другого не произошло. Spring Загрузка только не запускалась.

По-видимому, я скомпилировал сервер с Java 1.8, а на удаленном компьютере была Java 1.7.

После компиляции с Java 1.7 он начал работать.

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.7</java.version> <!-- added this line -->
    <start-class>myapp.SpringApplication</start-class>
</properties>

Ответ 7

Открытый класс Приложение расширяет SpringBootServletInitializer {}

просто расширяет SpringBootServletInitializer. Он будет работать в вашем AWS/tomcat

Ответ 8

У меня была такая же проблема, и я выяснил решение, следуя этому guide. Я бегу с целью в maven.

чистый пакет

Это сработало для меня Thanq

Ответ 9

Если ваша цель - развернуть приложение загрузки Spring для AWS, Boxfuse дает вам очень простое решение.

Все, что вам нужно сделать, это:

boxfuse run my-spring-boot-app-1.0.jar -env=prod

Это будет:

  • Предотвратите минимальное изображение ОС, специально разработанное для вашего приложения (примерно на 100x меньше, чем обычный дистрибутив Linux).
  • Нажмите его в безопасный онлайн-репозиторий
  • Преобразуйте его в AMI примерно за 30 секунд.
  • Создайте и настройте новый Elastic IP или ELB
  • Назначьте ему новое доменное имя
  • Запустите один или несколько экземпляров на основе вашего нового AMI

Все изображения генерируются в секундах и неизменяемы. Они могут работать без изменений на VirtualBox (dev) и AWS (test и prod).

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

Boxfuse также понимает, что ваш Spring конфигурационный файл для загрузки автоматически настраивает группы безопасности и проверки работоспособности ELB на основе application.properties.

Вот учебник, который поможет вам начать работу: https://boxfuse.com/getstarted/springboot

Отказ от ответственности: я являюсь основателем и генеральным директором Boxfuse

Ответ 10

Обновление 2018-02-03 с Spring Boot 1.5.8. ВЫПУСК.

В pom.xml вы должны сообщить плагину Spring, когда он собирает, что это файл war путем изменения пакета в war, например:

<packaging>war</packaging>

Кроме того, вы должны исключить встроенный tomcat при сборке пакета, добавив это:

    <!-- to deploy as a war in tomcat -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>

Полный пример запуска находится здесь https://www.surasint.com/spring-boot-create-war-for-tomcat/

Ответ 11

Если вы создаете новое приложение, а не конвертируете существующее, самый простой способ создать приложение Spring boot на основе WAR - это Spring Initializr.

Он автоматически создает приложение для вас. По умолчанию он создает Jar, но в дополнительных параметрах вы можете выбрать создание WAR. Эта война также может быть выполнена напрямую.

enter image description here

Еще проще создать проект из IntelliJ IDEA напрямую:

Файл → Новый проект → Spring Initializr