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ı?
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ı?
Yanıtlar:
İ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ı
gs-convert-jar-to-war/complete
Maven projesi yok rağmen gömülü Tomcat sunucu eklemek spring-boot-starter-tomcat
bağımlılık kapsamı ile beyan provided
. Bu bir böcek gibi geliyor. Ayrıca bkz stackoverflow.com/q/25991789/923560
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
application.properties
mükemmel bir şekilde çalışıyor.
spring.main.web-environment
artık kullanımdan kaldırılmıştır. Hala Boot 2.1.1 için çalışıyor
spring.main.web-application-type=none
spring.main.web-application-type=NONE
# REACTIVE, SERVLET
@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.
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.
En basit çözüm. application.properties dosyanızda. Önceki yanıtta belirtildiği gibi aşağıdaki özelliği ekleyin:
spring.main.web-environment = false
Spring boot starter 2.0.0 sürümü için aşağıdaki özelliği kullanın:
spring.main.web-application-type = yok
Tüm özelliklerle ilgili belgeler için şu bağlantıyı kullanın: https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
Bu kodu kullanın.
SpringApplication application = new SpringApplication(DemoApplication.class);
application.setWebApplicationType(WebApplicationType.NONE);
application.run(args);
Spring boot v2.1.3.RELEASE için, aşağıdaki özellikleri application.propertes'e eklemeniz yeterlidir:
spring.main.web-application-type=none
Uygulamanızda web işlevselliğine ihtiyacınız varsa ( org.springframework.web.client.RestTemplate
REST ç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>
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
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].
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>
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.
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>
İ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 RestTemplate
ve jackson
benim için kullanmam için.
@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);
spring-jms
bağımlılık olarak ekleyeceksiniz (sanırım). Ardından uygulamayı başlatın, hiçbir sunucu başlatılmayacaktır.