Весенняя загрузочная война развернута в Tomcat



Я пытаюсь развернуть приложение Spring Boot в 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;
}
}


приложение.свойства имеет следующее:



server.port=${port:7777}




  1. после прочтения ряда страницы и вопрос-ответы я добавил следующее Пом:




    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>




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


  3. Я запустил Tomcat и могу видеть свое приложение в списке, в моем случае "/highlighter-1.0-SNAPSHOT".

  4. нажатие на ссылку для результатов приложения на странице "статус 404".

  5. когда я запускаю приложение Spring Boot просто сам по себе, без контейнер он работает на localhost:7777, но там ничего нет, когда я запускаю его в Tomcat.


обновление:
Есть еще один ссылка. Не уверен, насколько это полезно.

624   10  

10 ответов:

в этом руководстве подробно объясняется, как развернуть приложение 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>

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

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

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

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

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

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

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

Эй, не забудьте сделать это изменения в 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>       

Это весь пом.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>

и класс приложения должен быть такой

приложение.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, щелкните правой кнопкой мыши в проекте, а затем перейдите к пути сборки->настроить путь сборки - >проектные лица

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

динамические web-модуля 3.1 Java 1.8 Javascript 1.0

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

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

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

ничего не произошло. Весенний ботинок просто не работал.

по-видимому, я скомпилировал сервер с 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>

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

public class Application extends SpringBootServletInitializer {}

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

чистый пакет

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

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

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

apply plugin: 'war'

добавить предоставил зависимость от tomcat

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

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

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

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

Это:

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

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

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

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

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

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

приложение public class расширяет SpringBootServletInitializer {}

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

обновление 2018-02-03 с пружинной загрузкой 1.5.8.ОСВОБОЖДАТЬ.

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

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

Comments

    Ничего не найдено.