Mengapa Aplikasi Booting Musim Semi saya selalu mati segera setelah memulai?

164

Ini adalah kode Boot Musim Semi pertama saya. Sayangnya, itu selalu dimatikan. Saya mengharapkannya untuk terus berjalan sehingga klien web saya bisa mendapatkan beberapa data dari browser.

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

Mohon saran.

Terima kasih

PS build.gradle adalah kesalahannya.

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

Begitu saya melepas garis di atas dalam huruf tebal, semuanya bekerja. Konteks aplikasi saya sekarang sudah benar. Terima kasih 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]]
johnsam
sumber
Apakah Anda menggunakan Maven atau Gradle?
Romain Moreau
1
Anda ApplicationContextsalah ketik ( AnnotationConfigApplicationContext), jadi ini bukan webapp. Seharusnya default ke nilai yang tergantung pada classpath Anda, jadi sepertinya itu diatur atau default dengan cara yang salah. Mungkin Anda memiliki application.propertiesatau ENV var Anda tidak ditampilkan?
Dave Syer
Kamu benar. ApplicationContext saya salah. Saya tidak punya file application.properties. Bagaimana cara membuatnya menjalankan ApplicationContext yang benar? Mungkin Konteks Aplikasi web?
johnsam
Mari kita coba dan sederhanakan bangunannya. Bisakah Anda menghapus semua dependensi kecuali spring-boot-starter-web, dan kemudian jalankan dengan --debugpada baris perintah dan posting log kembali ke sini, tolong?
Dave Syer
Dave, saya memperbarui posting asli saya karena tanggapannya terlalu lama.
johnsam

Jawaban:

345

Resolusi: aplikasi ini bukan aplikasi web karena tidak memiliki wadah yang disematkan (mis. Tomcat) di classpath. Menambahkan satu memperbaikinya. Jika Anda menggunakan Maven , tambahkan ini di pom.xml:

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

Untuk Gradle ( build.gradle) sepertinya

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-web'
}
Dave Syer
sumber
Bagaimana kamu melakukannya ?
Maksimal
2
Luar biasa inilah yang saya lewatkan!
Taobitz
5
Saya punya aplikasi java sederhana lalu mengapa kita perlu menambahkan dependensi ini?
AMAN KUMAR
Tolong sebutkan bahwa ketergantungan ini harus menjadi yang pertama.
Cosmin Oprea
Tapi tidak. Hanya di jalan setapak.
Dave Syer
31

Inilah cara Anda memperbaikinya:

  1. Periksa apakah Anda tidak memiliki ketergantungan pada spring-boot-starter-web di file pom.xml Anda. Untuk memperbaiki file pom.xml Anda, gunakan tautan ini start.spring.io

  2. Jika Anda memiliki ketergantungan di atas, tetapi masih menghadapi masalah, sangat mungkin bahwa toples tempel yang disematkan hadir. Untuk mengonfirmasi ini, jalankan maven build dalam mode debug -

mvn spring-boot:run --debug

dan cari pesan seperti -

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

Jika ada pesan seperti itu, bersihkan repo pakar setempat dan coba lagi -

mvn dependency:purge-local-repository

obrolan
sumber
setelah toples yang diperlukan hilang, dispatcherServlet tidak memulai. Jadi solusi di atas bekerja untuk saya.
user3029620
30

Saya memiliki masalah yang sama tetapi ketika saya dihapus

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

mulai bekerja lagi.

N. berouain
sumber
Aplikasi saya mulai berfungsi setelah saya menambahkan ketergantungan kucing jantan ini.
georgiana_e
1
@georgiana_e Aplikasi saya mulai berfungsi setelah saya menghapus ketergantungan tomcat: D Apa yang terjadi ??
Daria
: D sam as me @Daria.
RockOnGom
Saya mengganti Container Tertanam bawaan saya dengan Jetty untuk memperbaiki kesalahan. Sepertinya JAR Tomcat saya rusak, dan pembersihan .m2 diperlukan.
CᴴᴀZ
7

Mungkin tidak cocok dengan kode Anda tetapi saya tahu jika Anda memiliki potongan kode seperti ini:

@SpringBootApplication
public class SpringBootApacheKafkaApplication {

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

kemudian cukup hapus metode close (). Itu memperbaiki masalah saya! Mungkin saya bisa membantu seseorang dengan itu

Guchelkaben
sumber
3

Dalam kasus saya masalah diperkenalkan ketika saya memperbaiki kesalahan analisis statis bahwa nilai pengembalian metode tidak digunakan.

Kode kerja lama di Application.java saya adalah:

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

Kode baru yang menyebabkan masalah adalah:

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

Jelas, coba dengan blok sumber daya akan menutup konteks setelah memulai aplikasi yang akan menghasilkan aplikasi keluar dengan status 0. Ini adalah kasus di mana kesalahan kebocoran sumber daya yang dilaporkan oleh analisis statis snarqube harus diabaikan.

Farrukh Najmi
sumber
3

Dengan gradle, saya mengganti baris ini di file build.gradle.kts di dalam blok dependensi

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

dengan ini

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

dan bekerja dengan baik.

Pedro Muniz
sumber
2

Saya pikir jawaban yang tepat ada di Mengapa aplikasi web Spring Boot tutup segera setelah memulai? tentang starter-tomcat tidak diatur dan jika diatur dan dijalankan melalui IDE, ruang lingkup yang disediakan harus dikomentari. Lingkup tidak membuat masalah saat menjalankan melalui perintah. Kenapa ya.

Anyways baru saja menambahkan pemikiran tambahan saya.

Ajay Menon
sumber
2

Hanya kemungkinan lain,

Saya diganti

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

dengan

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

dan itu dimulai tanpa masalah

Mohammed Rafeeq
sumber
1

ini bekerja dengan spring boot 2.0.0

menggantikan

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

dengan

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

Dalam kasus saya, saya memperbaiki masalah ini seperti di bawah ini: -

  1. Pertama saya hapus (apache) C:\Users\myuserId\.m2\repository\org\apache

  2. Saya menambahkan dependensi di bawah ini di pom.xmlfile saya

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  3. Saya telah mengubah soket default dengan menambahkan baris di bawah ini dalam file sumber daya ..\yourprojectfolder\src\main\resourcesand\application.properties(saya secara manual membuat file ini)

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

    untuk itu saya telah menambahkan blok di pom.xmlbawah ini di <build>bagian bawah saya .

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

pom.xmlFile akhir saya terlihat seperti

<?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>
Abhijit Pritam Dutta
sumber
0

Jika Anda tidak ingin menjadikan pegas sebagai aplikasi web, tambahkan saja @EnableAsyncatau @EnableSchedulingke Starter Anda

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

}
deFreitas
sumber
0

dalam kasus saya, saya sudah memiliki ketergantungan pakar untuk 'spring-boot-starter-web' dan proyek akan dimulai dengan baik tanpa berhenti secara otomatis ketika saya menjalankannya sebagai aplikasi springboot dari dalam IDE . Namun, ketika saya menyebarkannya ke K8s , aplikasi akan memulai dan berhenti otomatis segera. Jadi saya memodifikasi kelas aplikasi utama saya untuk memperpanjang SpringBootServletInitializer dan ini tampaknya telah memperbaiki penghentian otomatis.

@SpringBootApplication public class MyApp extends SpringBootServletInitializer {  public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);  }}
abdel
sumber