Boot Musim Semi tanpa server web

104

Saya memiliki aplikasi Spring Boot sederhana yang menerima pesan dari antrian JMS dan menyimpan beberapa data ke file log, tetapi tidak memerlukan server web. Apakah ada cara untuk memulai Spring Boot tanpa server web?

Michael
sumber
3
Jika Anda tidak membutuhkan web maka jangan memasukkannya, jika tidak disertakan, server tertanam tidak akan dimulai. Anda hanya perlu orang tua pemula dan menambahkan spring-jms(saya kira) sebagai ketergantungan. Kemudian mulai aplikasinya, tidak ada server yang akan dimulai.
M. Deinum
1
Anda salah, saya hanya menggunakan spring-boot-starter-batch, saya tidak menyertakan tomcat atau konfigurasi server lain di pom.xml saya, namun menjalankan aplikasi meluncurkan wadah web. Ini harus mengambil parameter di suatu tempat.
Mehdi

Jawaban:

25

Spring boot tidak akan menyertakan tomcat tertanam jika Anda tidak memiliki dependensi Tomcat di classpath. Anda dapat melihat fakta ini sendiri di kelas EmbeddedServletContainerAutoConfigurationyang sumbernya dapat Anda temukan di sini .

Inti dari kode adalah penggunaan @ConditionalOnClassanotasi di kelasEmbeddedTomcat


Juga, untuk informasi lebih lanjut check out ini dan ini panduan dan ini bagian dari dokumentasi

geoand
sumber
Dalam versi saat ini, yang gs-convert-jar-to-war/completeproyek Maven tidak menambahkan Tomcat server yang tertanam, meskipun spring-boot-starter-tomcatketergantungan dinyatakan dengan ruang lingkup provided. Ini terasa seperti bug. Juga lihat stackoverflow.com/q/25991789/923560
Abdull
137

jika Anda ingin menjalankan spring boot tanpa container servlet, tetapi dengan container di classpath (misalnya untuk pengujian), gunakan yang berikut ini, seperti yang dijelaskan dalam dokumentasi spring boot :

@Configuration
@EnableAutoConfiguration
public class MyClass{
    public static void main(String[] args) throws JAXBException {
                 SpringApplication app = new SpringApplication(MyClass.class);
         app.setWebEnvironment(false); //<<<<<<<<<
         ConfigurableApplicationContext ctx = app.run(args);
    }
}

juga, saya baru saja menemukan properti ini:

spring.main.web-environment=false
Stefan K.
sumber
12
Hanya menambahkan properti untuk application.propertiesberfungsi dengan baik.
Wim Deblauwe
8
Ini berfungsi tetapi tidak digunakan lagi di Spring Boot 2.0. Lihat jawaban ini untuk versi 2.0: stackoverflow.com/a/44394305/66686
Jens Schauder
1
FYI: Properti spring.main.web-environmentini sekarang tidak digunakan lagi. Masih berfungsi untuk Boot 2.1.1
Sergey Karpushin
1
Boot 2.x - application.setWebApplicationType (WebApplicationType.NONE);
Michael Munsey
1
Apa yang Anda seharusnya menggunakan hari ini adalahspring.main.web-application-type=none
damd
96

Boot Musim Semi 2.x

  • Properti Aplikasi

    spring.main.web-application-type=NONE 
    # REACTIVE, SERVLET
  • atau SpringApplicationBuilder

    @SpringBootApplication
    public class MyApplication {
    
        public static void main(String[] args) {
            new SpringApplicationBuilder(MyApplication.class)
                .web(WebApplicationType.NONE) // .REACTIVE, .SERVLET
                .run(args);
       }
    }

Dimana WebApplicationType :

  • NONE - Aplikasi tidak boleh dijalankan sebagai aplikasi web dan tidak boleh menjalankan server web tertanam.
  • REACTIVE - Aplikasi harus dijalankan sebagai aplikasi web reaktif dan harus menjalankan server web reaktif tertanam.
  • SERVLET - Aplikasi harus dijalankan sebagai aplikasi web berbasis servlet dan harus menjalankan server web servlet tertanam.
kinjelom
sumber
54

Anda dapat membuat sesuatu seperti ini:

@SpringBootApplication
public class Application {
  public static void main(String[] args) {
    new SpringApplicationBuilder(Application.class).web(false).run(args);
  }
}

Dan

@Component
public class CommandLiner implements CommandLineRunner {

  @Override
  public void run(String... args) throws Exception {
    // Put your logic here
  }

}

Ketergantungan masih ada meskipun tidak digunakan.

sancho21.dll
sumber
Bisakah kita dengan aman menghapus ketergantungan sprign-boot-starter-web? Untuk saat ini membuat aplikasi non-web dan menghapus ketergantungan ini menyebabkan pengecualian ClassNotFound: javax.servlet.ServleContext
Simon Logic
Harap dicatat, solusi 1 tidak digunakan lagi
ACV
jawaban terbaik di dunia
prash
7

Untuk Spring boot v2.1.3.RELEASE, cukup tambahkan properti berikut ke application.propertes:

spring.main.web-application-type=none
Chun Hau Lai
sumber
6

Gunakan kode ini.

SpringApplication application = new SpringApplication(DemoApplication.class);
application.setWebApplicationType(WebApplicationType.NONE);
application.run(args);
nayun oh
sumber
3

Jika Anda memerlukan fungsionalitas web dalam aplikasi Anda (seperti org.springframework.web.client.RestTemplateuntuk panggilan REST) ​​tetapi Anda tidak ingin memulai server TOMCAT, cukup kecualikan di POM:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
Paul Rambags
sumber
3
  • Melalui program:

    ConfigurableApplicationContext ctx =  new  SpringApplicationBuilder(YourApplicationMain.class)
    .web(WebApplicationType.NONE)
    .run(args);
  • Melalui file application.properties:

    spring.main.web-environment=false 
  • Melalui file application.yml:

    spring:
     main:
      web-environment:false
Sucheth Shivakumar
sumber
2

Jika Anda ingin menggunakan salah satu template "Memulai" dari situs spring.io, tetapi Anda tidak memerlukan item terkait servlet apa pun yang disertakan dengan template "default" ("gs / spring-boot"), Anda dapat mencoba template tugas penjadwalan (yang pom * berisi spring-boot-starter dll) sebagai gantinya:

https://spring.io/guides/gs/scheduling-tasks/

Itu memberi Anda Spring Boot, dan aplikasi berjalan sebagai standalone (tidak ada servlet atau spring-webmvc dll yang termasuk dalam pom). Yang mana yang Anda inginkan (meskipun Anda mungkin perlu menambahkan beberapa hal khusus JMS, seperti yang sudah ditunjukkan orang lain).

[* Saya menggunakan Maven, tetapi asumsikan bahwa build Gradle akan bekerja dengan cara yang sama].

murmelssonic
sumber
2

Hapus ketergantungan berikut pada file pom Anda akan bekerja untuk saya

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
vaquar khan
sumber
1

Untuk Kotling inilah yang saya gunakan belakangan ini:


// src/main/com.blabla/ShellApplication.kt

/**
 * Main entry point for the shell application.
 */
@SpringBootApplication
public class ShellApplication : CommandLineRunner {
    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            val application = SpringApplication(ShellApplication::class.java)
            application.webApplicationType = WebApplicationType.NONE
            application.run(*args);
        }
    }

    override fun run(vararg args: String?) {}
}

// src/main/com.blabla/command/CustomCommand.kt

@ShellComponent
public class CustomCommand {
    private val logger = KotlinLogging.logger {}

    @ShellMethod("Import, create and update data from CSV")
    public fun importCsv(@ShellOption() file: String) {
        logger.info("Hi")
    }
}

Dan semuanya boot biasanya berakhir dengan shell dengan perintah kustom saya tersedia.

Vincent
sumber
1

Anda dapat menggunakan dependensi spring-boot-starter. Ini tidak akan memiliki barang web.

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

Dalam boot Spring, ketergantungan Spring Web menyediakan server web Apache Tomcat tertanam. Jika Anda menghapus ketergantungan spring-boot-starter-web di pom.xml maka itu tidak menyediakan server web tertanam.

hapus ketergantungan berikut

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>
Zakib Ali
sumber
Catatan: Pemula idealnya adalah POM induk, bukan ketergantungan
OneCricketeer
0

Mirip dengan @nayun oh jawaban di atas, tetapi untuk Spring versi lama, gunakan kode ini:

SpringApplication application = new SpringApplication(DemoApplication.class);
application.setApplicationContextClass(AnnotationConfigApplicationContext.class);
application.run(args);
Chris Wolf
sumber