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?
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?
Jawaban:
Spring boot tidak akan menyertakan tomcat tertanam jika Anda tidak memiliki dependensi Tomcat di classpath. Anda dapat melihat fakta ini sendiri di kelas EmbeddedServletContainerAutoConfiguration
yang sumbernya dapat Anda temukan di sini .
Inti dari kode adalah penggunaan @ConditionalOnClass
anotasi di kelasEmbeddedTomcat
Juga, untuk informasi lebih lanjut check out ini dan ini panduan dan ini bagian dari dokumentasi
gs-convert-jar-to-war/complete
proyek Maven tidak menambahkan Tomcat server yang tertanam, meskipun spring-boot-starter-tomcat
ketergantungan dinyatakan dengan ruang lingkup provided
. Ini terasa seperti bug. Juga lihat stackoverflow.com/q/25991789/923560
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
application.properties
berfungsi dengan baik.
spring.main.web-environment
ini sekarang tidak digunakan lagi. Masih berfungsi untuk Boot 2.1.1
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);
}
}
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.
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.
Solusi paling sederhana. di file application.properties Anda. tambahkan properti berikut seperti yang disebutkan oleh jawaban sebelumnya:
spring.main.web-environment = false
Untuk versi 2.0.0 dari Spring boot starter, gunakan properti berikut:
spring.main.web-application-type = none
Untuk dokumentasi tentang semua properti, gunakan tautan ini: https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
Untuk Spring boot v2.1.3.RELEASE, cukup tambahkan properti berikut ke application.propertes:
spring.main.web-application-type=none
Jika Anda memerlukan fungsionalitas web dalam aplikasi Anda (seperti org.springframework.web.client.RestTemplate
untuk 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>
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
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].
Hapus ketergantungan berikut pada file pom Anda akan bekerja untuk saya
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
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.
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>
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);
spring-jms
(saya kira) sebagai ketergantungan. Kemudian mulai aplikasinya, tidak ada server yang akan dimulai.