Dlaczego moja aplikacja Spring Boot zawsze wyłącza się natychmiast po uruchomieniu?


164

To jest mój pierwszy kod Spring Boot. Niestety zawsze się wyłącza. Spodziewałem się, że będzie działać w sposób ciągły, aby mój klient sieciowy mógł pobierać dane z przeglądarki.

package hello;
import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.stereotype.*;
import org.springframework.web.bind.annotation.*;

@Controller
@EnableAutoConfiguration
public class SampleController {

    @RequestMapping("/")
    @ResponseBody
    String home() {
        return "Hello World!";
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(SampleController.class, args);
    }
}


[@localhost initial]$ java -jar build/libs/gs-spring-boot-0.1.0.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::            (v1.0.0.RC4)

2014-03-13 09:20:24.805  INFO 14650 --- [           main] hello.SampleController                   : Starting SampleController on localhost.localdomain with PID 14650 (/home/xxx/dev/gs-spring-boot/initial/build/libs/gs-spring-boot-0.1.0.jar started by xxx)
2014-03-13 09:20:25.002  INFO 14650 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@b9eec: startup date [Thu Mar 13 09:20:24 EDT 2014]; root of context hierarchy
2014-03-13 09:20:28.833  INFO 14650 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Registering beans for JMX exposure on startup
2014-03-13 09:20:30.148  INFO 14650 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Starting beans in phase 0
2014-03-13 09:20:30.154  INFO 14650 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Located managed bean 'requestMappingEndpoint': registering with JMX server as MBean [org.springframework.boot:type=Endpoint,name=requestMappingEndpoint]
2014-03-13 09:20:30.316  INFO 14650 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Located managed bean 'environmentEndpoint': registering with JMX server as MBean [org.springframework.boot:type=Endpoint,name=environmentEndpoint]
2014-03-13 09:20:30.335  INFO 14650 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Located managed bean 'healthEndpoint': registering with JMX server as MBean [org.springframework.boot:type=Endpoint,name=healthEndpoint]
2014-03-13 09:20:30.351  INFO 14650 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Located managed bean 'beansEndpoint': registering with JMX server as MBean [org.springframework.boot:type=Endpoint,name=beansEndpoint]
2014-03-13 09:20:30.376  INFO 14650 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Located managed bean 'infoEndpoint': registering with JMX server as MBean [org.springframework.boot:type=Endpoint,name=infoEndpoint]
2014-03-13 09:20:30.400  INFO 14650 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Located managed bean 'metricsEndpoint': registering with JMX server as MBean [org.springframework.boot:type=Endpoint,name=metricsEndpoint]
2014-03-13 09:20:30.413  INFO 14650 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Located managed bean 'traceEndpoint': registering with JMX server as MBean [org.springframework.boot:type=Endpoint,name=traceEndpoint]
2014-03-13 09:20:30.428  INFO 14650 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Located managed bean 'dumpEndpoint': registering with JMX server as MBean [org.springframework.boot:type=Endpoint,name=dumpEndpoint]
2014-03-13 09:20:30.450  INFO 14650 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Located managed bean 'autoConfigurationAuditEndpoint': registering with JMX server as MBean [org.springframework.boot:type=Endpoint,name=autoConfigurationAuditEndpoint]
2014-03-13 09:20:30.465  INFO 14650 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Located managed bean 'shutdownEndpoint': registering with JMX server as MBean [org.springframework.boot:type=Endpoint,name=shutdownEndpoint]
2014-03-13 09:20:30.548  INFO 14650 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Located managed bean 'configurationPropertiesReportEndpoint': registering with JMX server as MBean [org.springframework.boot:type=Endpoint,name=configurationPropertiesReportEndpoint]
2014-03-13 09:20:30.589  INFO 14650 --- [           main] hello.SampleController                   : Started SampleController in 7.396 seconds (JVM running for 9.569)
2014-03-13 09:20:30.608  INFO 14650 --- [       Thread-2] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@b9eec: startup date [Thu Mar 13 09:20:24 EDT 2014]; root of context hierarchy
2014-03-13 09:20:30.610  INFO 14650 --- [       Thread-2] o.s.c.support.DefaultLifecycleProcessor  : Stopping beans in phase 0
2014-03-13 09:20:30.624  INFO 14650 --- [       Thread-2] o.s.b.a.e.jmx.EndpointMBeanExporter      : Unregistering JMX-exposed beans on shutdown

Proszę doradź.

Dzięki

PS build.gradle to wina.

dependencies {
    // tag::jetty[]
    compile("org.springframework.boot:spring-boot-starter-web") {
        **exclude module: "spring-boot-starter-tomcat"**
    }

Kiedy już zdjąłem powyższą linię pogrubioną czcionką, wszystko działa. Kontekst mojej aplikacji jest teraz poprawny. Dzięki, Dave

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::            (v1.0.0.RC4)

2014-03-13 13:58:08.965  INFO 7307 --- [           main] hello.Application                        : Starting
 Application on  with PID 7307 (/ladev/home/xxx/dev/gs-spring-boot/initial/build/libs/gs-spring-boo
t-0.1.0.jar started by xxx)
2014-03-13 13:58:09.021  INFO 7307 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshi
ng org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@45490eb5: startup
 date [Thu Mar 13 13:58:09 MDT 2014]; root of context hierarchy
2014-03-13 13:58:09.653  INFO 7307 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Overridi
ng bean definition for bean 'beanNameViewResolver': replacing [Root bean: class [null]; scope=; abstract=fal
se; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanNam
e=org.springframework.boot.actuate.autoconfigure.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration;
 factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class
 path resource [org/springframework/boot/actuate/autoconfigure/ErrorMvcAutoConfiguration$WhitelabelErrorView
Configuration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3;
 dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconf
igure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; in
itMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/au
toconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]]

Czy używasz Maven czy Gradle?
Romain Moreau

1
Twój ApplicationContextjest niewłaściwego typu ( AnnotationConfigApplicationContext), więc nie jest to aplikacja internetowa. Powinien domyślnie mieć wartość zależną od ścieżki klas, więc wygląda na to, że jest ustawiana lub domyślna w niewłaściwy sposób. Może masz application.propertieszmienną ENV lub ENV, której nie wyświetlasz?
Dave Syer

Masz rację. Mój kontekst aplikacji jest nieprawidłowy. Nie mam pliku application.properties. Jak sprawić, by uruchamiał odpowiedni ApplicationContext? Może Web ApplicationContext?
johnsam

Spróbujmy uprościć kompilację. Czy możesz usunąć wszystkie zależności z wyjątkiem spring-boot-starter-web, a następnie uruchomić z --debugwierszem poleceń i przesłać dzienniki z powrotem tutaj, proszę?
Dave Syer

Dave, zaktualizowałem mój oryginalny post, ponieważ odpowiedzi były zbyt długie.
johnsam

Odpowiedzi:


345

Rozwiązanie: aplikacja nie jest aplikacją internetową, ponieważ nie ma osadzonego kontenera (np. Tomcat) w ścieżce klas. Dodanie jednego rozwiązało problem. Jeśli używasz Mavena , dodaj to w pom.xml:

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

Dla Gradle ( build.gradle) to wygląda

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-web'
}

Jak to robisz?
maxime

2
Świetnie, tego mi brakowało!
Taobitz

5
Mam prostą aplikację java, więc dlaczego musimy dodać tę zależność?
AMAN KUMAR

Proszę wspomnieć, że ta zależność musi być pierwszą.
Cosmin Oprea

Ale tak nie jest. Tylko na ścieżce klas.
Dave Syer

31

Oto, jak możesz to naprawić:

  1. Sprawdź, czy nie masz zależności od spring-boot-starter-web w pliku pom.xml. Aby poprawnie uzyskać plik pom.xml, użyj tego linku start.spring.io

  2. Jeśli masz powyższą zależność, ale nadal masz problem, jest wysoce prawdopodobne, że są obecne osadzone słoiki Tomcat. Aby to potwierdzić, uruchom maven build w trybie debugowania -

mvn spring-boot:run --debug

i poszukaj wiadomości typu -

[WARNING] error reading /Users/sparrowmac1/.m2/repository/org/apache/tomcat/embed/tomcat-embed-core/8.5.20/tomcat-embed-core-8.5.20.jar; invalid LOC header (bad signature) [WARNING] error reading /Users/sparrowmac1/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.8.10/jackson-core-2.8.10.jar; invalid LOC header (bad signature)

Jeśli takie wiadomości są obecne, wyczyść lokalne repozytorium Maven i spróbuj ponownie -

mvn dependency:purge-local-repository


gdy brakuje wymaganych plików jar, dispatcherServlet nie uruchamia się. Więc powyższe rozwiązanie działa dla mnie.
user3029620

30

Miałem ten sam problem, ale kiedy usunąłem

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

znowu zaczęło działać.


Moja aplikacja zaczęła działać po dodaniu tej zależności Tomcat.
georgiana_e

1
@georgiana_e Moja aplikacja zaczęła działać po usunięciu zależności tomcat: D Co się dzieje?
Daria

: D sam as me @Daria.
RockOnGom

Zastąpiłem mój domyślny osadzony kontener na Jetty, aby naprawić błąd. Wygląda na to, że moje pliki JAR Tomcat były zepsute i konieczne było przedmuchanie .m2.
CᴴᴀZ

7

Może to nie pasuje do twojego kodu, ale dowiedziałem się, czy masz taki fragment kodu:

@SpringBootApplication
public class SpringBootApacheKafkaApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootApacheKafkaApplication.class,args).close();
    }
}

następnie po prostu usuń metodę close (). To rozwiązało mój problem! Może mógłbym komuś w tym pomóc


3

W moim przypadku problem pojawił się, gdy naprawiłem błąd analizy statycznej, że wartość zwracana metody nie została użyta.

Stary działający kod w mojej Application.java to:

    public static void main(String[] args) {        
      SpringApplication.run(Application.class, args);
    }

Nowy kod, który spowodował problem, to:

    public static void main(String[] args) {        
      try (ConfigurableApplicationContext context = 
          SpringApplication.run(Application.class, args)) {
        LOG.trace("context: " + context);
      }
    }

Oczywiście próba z blokiem zasobów zamknie kontekst po uruchomieniu aplikacji, co spowoduje wyjście aplikacji ze statusem 0. To był przypadek, w którym błąd wycieku zasobów zgłoszony przez analizę statyczną snarqube powinien zostać zignorowany.


3

W gradle zastąpiłem tę linię w pliku build.gradle.kts wewnątrz bloku zależności

providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")

z tym

compile("org.springframework.boot:spring-boot-starter-web")

i działa dobrze.



2

Po prostu inna możliwość,

Wymieniłem

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

z

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

i zaczęło się bez żadnych problemów


1

to działa z butem sprężynowym 2.0.0

zastąpić

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

z

<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.6</version>
    </dependency>

1

W moim przypadku naprawiłem ten problem jak poniżej: -

  1. Najpierw usunąłem (apache) C:\Users\myuserId\.m2\repository\org\apache

  2. Dodałem poniżej zależności w moim pom.xmlpliku

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  3. Zmieniłem domyślne gniazdo, dodając poniższe wiersze w pliku zasobów ..\yourprojectfolder\src\main\resourcesand\application.properties(utworzyłem ten plik ręcznie)

     server.port=8099
     spring.profiles.active=@spring.profiles.active@

    w tym celu dodałem poniżej blok w mojej sekcji pom.xmlponiżej <build>.

      <build>
      .
      .
     <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
       .
       .    
      </build>

Mój ostateczny pom.xmlplik wygląda jak

<?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.bhaiti</groupId>
    <artifactId>spring-boot-rest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>spring-boot-rest</name>
    <description>Welcome project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.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>
    </properties>

    <dependencies>

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

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

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

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>

    </build>


</project>

0

Jeśli nie chcesz, aby Twoja wiosna była aplikacją internetową, po prostu dodaj @EnableAsynclub @EnableSchedulingdo swojego Startera

@EnableAsync
@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

}

0

w moim przypadku miałem już zależność maven do „spring-boot-starter-web” i projekt zaczynałby się dobrze bez automatycznego zatrzymywania, gdy uruchamiam go jako aplikację springboot z poziomu IDE . Jednak po wdrożeniu go na K8 aplikacja uruchamia się i automatycznie zatrzymuje. Więc zmodyfikowałem moją główną klasę aplikacji, aby rozszerzyć SpringBootServletInitializer i wydaje się, że to naprawiło automatyczne zatrzymywanie.

@SpringBootApplication public class MyApp extends SpringBootServletInitializer {  public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);  }}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.