Wiosenna wojna rozruchowa w Tomcat

Próbuję wdrożyć aplikację Spring Boot do Tomcat, ponieważ chcę wdrożyć do AWS. Stworzyłem plik wojenny, ale nie działa na Tomcacie, mimo że jest widoczny.

Szczegóły:
0. Oto moja aplikacja:

@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;
    }
}

Zastosowanie.właściwości mają następujące właściwości:

server.port=${port:7777}
  1. Po przeczytaniu kilku stron i Pytania-odpowiedzi dodałem następujące do mojego 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>
    

  2. Uruchomiłem "mvn package" i dostałem plik WAR (rozmiar 250MB), który umieściłem w folderze "webapps".

  3. zacząłem Tomcat i jestem w stanie zobaczyć moją aplikację na liście, w moim przypadku "/ highlighter-1.0-SNAPSHOT".
  4. kliknięcie linku do aplikacji powoduje wyświetlenie strony "Status 404".
  5. kiedy uruchamiam aplikację Spring Boot sama, bez kontenera działa na localhost: 7777, ale nic tam nie ma, gdy uruchamiam ją w Tomcat.

Update: Jest jeszcze jedna Referencja . Nie wiem, jak to jest przydatne.

Author: Community, 2015-01-12

10 answers

Ten przewodnik wyjaśnia szczegółowo, jak wdrożyć aplikację Spring Boot na Tomcat:
http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war-file

W zasadzie musiałem dodać następującą klasę:

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

Dodałem również do pom następującą właściwość:

<properties>        
    <start-class>mypackage.App</start-class>
</properties>
 89
Author: Daniil Shevelev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-13 19:43:34

Myślę, że jesteś zdezorientowany przez różne paradygmaty. Po pierwsze, pliki wojenne i wdrażanie serwerów -- te rzeczy należą do Java Enterprise Edition (Java EE). Pojęcia te nie mają realnego miejsca w aplikacji spring-boot, która podąża za innym modelem.

Spring-boot jest odpowiedzialny za tworzenie osadzonego kontenera i uruchamianie w nim usług bezpośrednio ze standardowych plików jar(chociaż może zrobić o wiele więcej). Myślę, że intencją tego modelu jest wspieranie mikroprzedsiębiorstw rozwój - gdzie każda usługa ma swój własny kontener i jest całkowicie samodzielna. Możesz również użyć kodu do generowania aplikacji Java EE, ale byłoby to głupie, biorąc pod uwagę, że spring-boot jest o wiele łatwiejszy (dla niektórych rodzajów aplikacji/usług).

Więc, biorąc pod uwagę te informacje, musisz teraz zdecydować, jaki paradygmat zamierzasz podążać, i musisz podążać za tym i tylko tym.

Spring-boot jest wykonywalny -- wystarczy uruchomić główną metodę w klasie aplikacji, która możesz to zrobić z linii poleceń lub używając swojego ulubionego IDE lub Mavena lub gradle (wskazówka: maven jest właściwą odpowiedzią). Spowoduje to uruchomienie serwera tomcat (domyślnie), a Twoja usługa będzie dostępna w nim. Biorąc pod uwagę konfigurację, którą napisałeś powyżej, Twoja usługa powinna być dostępna pod adresem: http://localhost:7777/context/help -- context ma zostać zastąpiona nazwą kontekstu, której nie udostępniłeś.

Nie jesteś stworzony do tworzenia wojny, prowadzenia tomcat, lub rozmieszczania czegokolwiek. Nic z tego nie jest konieczne w sprężynowy but. Opakowanie w Twoim pom powinno być jar, a nie war i scope z spring-boot-starter-tomcat powinno zostać usunięte - na pewno nie jest dostarczone.

Kiedy uruchamiasz główną metodę, wyjście konsoli powinno wskazywać kontekst, który zarejestrowałeś; użyj tego, aby uzyskać poprawny adres URL.

Mimo wszystko spring-boot musi na razie istnieć w świecie JEE (dopóki nie zostanie powszechnie przyjęty). Z tego powodu ludzie wiosny udokumentowali podejście do budowania wojny, a nie wykonywalny jar, do wdrożenia do kontenera servlet lub JEE. Dzięki temu wiele technologii spring-boot może być używanych w środowiskach, w których istnieją ograniczenia dotyczące używania czegokolwiek poza wojnami (lub uszami). Jest to jednak tylko odpowiedź na fakt, że takie środowiska są dość powszechne i nie są postrzegane jako konieczne, a nawet pożądane, część rozwiązania.
 19
Author: Engineer Dollery,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-13 23:58:03

/ Align = "left" / xml

<packaging>war</packaging>

W sekcji zależności upewnij się, że podano, że tomcat jest dostarczony, więc nie potrzebujesz osadzonej wtyczki 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>       
To jest cały 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>

I klasa aplikacji powinna być taka

Zastosowanie.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);
    }

}

I możesz dodać kontroler do testowania Mycontrollera.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!";
    }
}

Następnie możesz uruchomić projekt w wersji tomcat 8 i uzyskać dostęp do controller like this

Http://localhost:8080/demo/hi

Jeśli z jakiegoś powodu nie możesz dodać projektu do programu tomcat, kliknij prawym przyciskiem myszy w projekcie, a następnie przejdź do ścieżki budowania->skonfiguruj ścieżkę budowania - > twarze projektu

Upewnij się, że wybrano tylko te 3

Dynamic web Module 3.1 Java 1.8 Javascript 1.0

 15
Author: Cesar Chavez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-12 07:10:31

Po wykonaniu poradnika (lub skorzystaniu z Spring Initializr), miałem wojnę, która działała na moim lokalnym komputerze, ale nie działała zdalnie(działa na Tomcat).

Nie było Komunikatu o błędzie, po prostu napisano "znaleziono inicjalizator Spring servlet", ale nic nie zrobił.

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.

I

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()
Nic więcej się nie wydarzyło. Wiosenny but po prostu nie biegł.

Najwyraźniej skompilowałem serwer z Javą 1.8, A zdalny komputer miał Javę 1.7.

Po kompilacji z Java 1.7, zaczęło działać.

<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>
 2
Author: EpicPandaForce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-17 15:05:17

Twoja Application.java klasa powinna rozszerzyć SpringBootServletInitializer klasę ex:

public class Application extends SpringBootServletInitializer {}
 2
Author: Jaishant Biradar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-03 06:56:42

Miałem ten sam problem i znalazłem rozwiązanie podążając za tym poradnikiem . Biegam z bramką w maven.

Czysty pakiet

Its worked for me Thanq

 2
Author: VISHWANATH N P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-28 12:33:04

Rozwiązanie dla osób stosujących Gradle

Dodaj plugin do build.gradle

apply plugin: 'war'

Dodaj pod warunkiem zależność do tomcat

dependencies {
    // other dependencies
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}
 2
Author: Marcin Szymczak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-19 06:48:37

Jeśli twoim celem jest wdrożenie aplikacji Spring Boot do AWS, Boxfuse daje bardzo proste rozwiązanie.

Wszystko, co musisz zrobić, to:

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

To będzie:

    W tym samym roku, w 2009 roku, w ramach projektu "The Sims 2009", w ramach projektu "The Sims 2009", w 2009 roku, w ramach projektu "The Sims 2009".]} [13]} wypchnij go do bezpiecznego repozytorium online
  • przekształć go w AMI w około 30 sekund
  • Tworzenie i konfiguracja nowego elastycznego IP lub ELB
  • Przypisz a nowa nazwa domeny
  • Uruchom jedną lub więcej instancji na podstawie nowego AMI

Wszystkie obrazy są generowane w kilka sekund i są niezmienne. Mogą być uruchamiane bez zmian na VirtualBox (dev) i AWS (test & prod).

Wszystkie aktualizacje są wykonywane jako zero-downtime blue/green deployments i możesz również włączyć automatyczne skalowanie za pomocą jednego polecenia.

Boxfuse rozumie również, że konfiguracja Spring Boot Config automatycznie skonfiguruje grupy zabezpieczeń i ELB health kontrole w oparciu o Twoje application.properties.

Oto samouczek, który pomoże Ci zacząć: https://boxfuse.com/getstarted/springboot

Uwaga: jestem założycielem i prezesem Boxfuse

 0
Author: Axel Fontaine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-17 14:46:36

Public class Application extends SpringBootServletInitializer {}

Po prostu rozszerza SpringBootServletInitializer. Będzie działać w Twoim AWS / tomcat

 0
Author: junnyea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-03 11:01:42

Aktualizacja 2018-02-03 Z Spring Boot 1.5.8.Uwolnij.

W pom.xml, musisz powiedzieć wtyczce Spring kiedy buduje, że jest to plik wojny przez zmianę pakietu na wojnę, jak to:

<packaging>war</packaging>

Ponadto, musisz wykluczyć osadzony tomcat podczas budowania pakietu, dodając To:

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

Pełny przykład jest tutaj https://www.surasint.com/spring-boot-create-war-for-tomcat/

 0
Author: Surasin Tancharoen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-03 14:50:31