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}
-
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>
Uruchomiłem "mvn package" i dostałem plik WAR (rozmiar 250MB), który umieściłem w folderze "webapps".
- zacząłem Tomcat i jestem w stanie zobaczyć moją aplikację na liście, w moim przypadku "/ highlighter-1.0-SNAPSHOT".
- kliknięcie linku do aplikacji powoduje wyświetlenie strony "Status 404".
- 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.
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>
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ś.
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.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
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
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>
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 {}
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
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'
}
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
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
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/
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