Web sunucusu olmadan Spring Boot


113

Bir JMS kuyruğundan mesajlar alan ve bazı verileri bir günlük dosyasına kaydeden, ancak bir web sunucusuna ihtiyaç duymayan basit bir Spring Boot uygulamam var. Spring Boot'u web sunucusu olmadan başlatmanın bir yolu var mı?


3
Web'e ihtiyacınız yoksa eklemeyin, dahil edilmediğinde katıştırılmış sunucu başlamaz. Sadece başlangıç ​​ebeveynine ihtiyacınız olacak ve spring-jmsbağımlılık olarak ekleyeceksiniz (sanırım). Ardından uygulamayı başlatın, hiçbir sunucu başlatılmayacaktır.
M.Deinum


1
Yanılıyorsunuz, sadece spring-boot-starter-batch kullanıyorum, pom.xml dosyama herhangi bir tomcat veya başka sunucu yapılandırması eklemiyorum, ancak uygulamanın çalıştırılması bir web kapsayıcısı başlatıyor. Bir yerde bir parametre almalı.
Mehdi

Yanıtlar:


24

İlkbahar önyüklemesi, sınıf yolunda Tomcat bağımlılıklarınız yoksa gömülü tomcat'i içermeyecektir. Bu gerçeği EmbeddedServletContainerAutoConfiguration, kaynağını burada bulabileceğiniz sınıfta kendiniz görüntüleyebilirsiniz .

Kodun eti @ConditionalOnClass, sınıftaki açıklamanın kullanımıdırEmbeddedTomcat


Ayrıca, daha çok bilgi dışarı kontrol için bu ve bu kılavuzda ve bu belgelerin bir kısmı


Bugünkü versiyonunda, gs-convert-jar-to-war/completeMaven projesi yok rağmen gömülü Tomcat sunucu eklemek spring-boot-starter-tomcatbağımlılık kapsamı ile beyan provided. Bu bir böcek gibi geliyor. Ayrıca bkz stackoverflow.com/q/25991789/923560
Abdull

140

Yaylı önyüklemeyi sunucu uygulaması kapsayıcısı olmadan, ancak sınıf yolunda bir tane ile (örneğin testler için) çalıştırmak istiyorsanız, yay önyükleme belgelerinde açıklandığı gibi aşağıdakileri kullanın :

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

ayrıca, bu mülke rastladım:

spring.main.web-environment=false

12
Sadece mülkü eklemek application.propertiesmükemmel bir şekilde çalışıyor.
Wim Deblauwe

8
Bu çalışır, ancak Spring Boot 2.0'da kullanımdan kaldırılmıştır. 2.0 sürümü için bu yanıta bakın: stackoverflow.com/a/44394305/66686
Jens Schauder

1
Bilginize: Bu mülk spring.main.web-environmentartık kullanımdan kaldırılmıştır. Hala Boot 2.1.1 için çalışıyor
Sergey Karpushin

1
Boot 2.x - application.setWebApplicationType (WebApplicationType.NONE);
Michael Munsey

3
Bu günlerde kullanmanız gereken şeyspring.main.web-application-type=none
Damd

105

Spring Boot 2.x

  • Uygulama Özellikleri

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

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

Nerede WebApplicationType :

  • NONE - Uygulama bir web uygulaması olarak çalışmamalı ve katıştırılmış bir web sunucusu başlatmamalıdır.
  • REACTIVE - Uygulama reaktif bir web uygulaması olarak çalışmalı ve gömülü bir reaktif web sunucusu başlatmalıdır.
  • SERVLET - Uygulama, sunucu tabanlı bir web uygulaması olarak çalışmalı ve gömülü bir sunucu uygulaması web sunucusu başlatmalıdır.

54

Bunun gibi bir şey yaratabilirsiniz:

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

Ve

@Component
public class CommandLiner implements CommandLineRunner {

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

}

Bağımlılık hala var ama kullanılmıyor.


Sprign-boot-starter-web bağımlılığını güvenle kaldırabilir miyiz? Şimdilik uygulamayı web dışı yapmak ve bu bağımlılığı kaldırmak istisnaya neden oluyor ClassNotFound: javax.servlet.ServleContext
Simon Logic

Lütfen 1. çözümün kullanımdan kaldırıldığını unutmayın
ACV


9

Bu kodu kullanın.

SpringApplication application = new SpringApplication(DemoApplication.class);
application.setWebApplicationType(WebApplicationType.NONE);
application.run(args);

8

Spring boot v2.1.3.RELEASE için, aşağıdaki özellikleri application.propertes'e eklemeniz yeterlidir:

spring.main.web-application-type=none

4

Uygulamanızda web işlevselliğine ihtiyacınız varsa ( org.springframework.web.client.RestTemplateREST çağrıları gibi ) ancak bir TOMCAT sunucusu başlatmak istemiyorsanız, bunu POM'da hariç tutmanız yeterlidir:

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

4
  • Program aracılığıyla:

    ConfigurableApplicationContext ctx =  new  SpringApplicationBuilder(YourApplicationMain.class)
    .web(WebApplicationType.NONE)
    .run(args);
    
  • Application.properties dosyası aracılığıyla:

    spring.main.web-environment=false 
    
  • Application.yml dosyası aracılığıyla:

    spring:
     main:
      web-environment:false
    

2

Spring.io sitesindeki "Başlarken" şablonlarından birini kullanmak istiyorsanız, ancak "varsayılan" ("gs / spring-boot") şablonuyla birlikte gelen sunucu uygulamasıyla ilgili herhangi bir öğeye ihtiyacınız yoksa, bunun yerine zamanlama görevleri şablonunu deneyebilirsiniz (pom *, yaylı önyükleme başlatıcı vb. içerir):

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

Bu size Spring Boot sağlar ve uygulama bağımsız olarak çalışır (pom'a sunucu uygulaması veya spring-webmvc vb. Dahil değildir). İstediğiniz şey buydu (yine de bir başkasının işaret ettiği gibi JMS'ye özgü bazı şeyler eklemeniz gerekebilir).

[* Maven kullanıyorum, ancak bir Gradle yapısının benzer şekilde çalışacağını varsayalım].


2

Pom dosyanıza olan aşağıdaki bağımlılığı kaldırın benim için çalışacak

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

2

Kotling için son zamanlarda kullandığım şey:


// 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")
    }
}

Ve her şey normalde özel komutumun mevcut olduğu bir kabukla sonuçlanıyor.


1

Spring-boot-starter bağımlılığını kullanabilirsiniz. Bu web malzemelerine sahip olmayacak.

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

1

Spring önyüklemede, Spring Web bağımlılığı gömülü bir Apache Tomcat web sunucusu sağlar. Eğer kaldırırsanız yay çizme-marş-web pom.xml'Bu bağımlılığı daha sonra gömülü bir web sunucusu sağlamaz.

aşağıdaki bağımlılığı kaldırın

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

Not: Yeni başlayanlar ideal olarak bağımlılık değil, ebeveyn POM olmalıdır
OneCricketeer

1

İlkbahar önyüklemesinin birçok başlatıcısı vardır, bazı yeni başlayanların yerleşik bir web sunucusu vardır, bazılarının yoktur. Aşağıdakiler katıştırılmış web sunucusuna sahiptir:

spring-boot-starter-web
spring-boot-starter-data-jpa
spring-boot-starter-jetty
spring-boot-starter-tomcat
spring-boot-starter-jdbc
spring-boot-starter-data-rest
...

Gereksinimlerinizi karşılayan ve sunucu desteği olmayan birini seçin.

Bahar uygulamamda sadece dinlendirici json api talebinde bulunmam gerekiyor, bu yüzden ihtiyacım olan başlangıç

spring-boot-starter-json

hangi sağlar RestTemplateve jacksonbenim için kullanmam için.


0

@Nayun oh yanıtına benzer, ancak Spring'in eski sürümleri için şu kodu kullanın:

SpringApplication application = new SpringApplication(DemoApplication.class);
application.setApplicationContextClass(AnnotationConfigApplicationContext.class);
application.run(args);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.