[英]Spring Boot Application with Two Entrypoints: CLI and Web Service
我創建了一個 spring-boot-starter 應用程序,它作為 CommandLineRunner 啟動,在 Kubernetes 中作為 CronJob 運行,類似於:
@SpringBootApplication
@EnableAutoConfiguration
public class JobApplication implements CommandLineRunner {
Logger logger = LoggerFactory.getLogger(JobApplication.class);
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(JobApplication.class, args);
context.close();
}
@Override
public void run(String... args) throws Exception {
// run the job
}
}
我目前在這樣的 Dockerfile 中運行該應用程序,一切正常。
CMD java -jar /job/job.jar
在這個應用程序中有一些數據庫代碼和 DTO,我想使用它們並作為 Spring Web 服務公開,最好在同一個代碼庫中,這樣我就不必創建多個 Github 存儲庫和 Java 項目並發布一個共享庫用。 我想保持簡單,並且能夠直接編譯和使用它們。
有沒有辦法做到這一點? 我想我需要第二個 WebApplication 類,但是我不確定如何執行它,所以它使用它而不是 Job。
如果沒有,是否有推薦的方法來做我想做的事情(如果這是唯一的方法,構建多個 jar 是可以的……但我真的很想將所有代碼保留在同一個項目中)?
您是否嘗試過使用@Profile
?
例如:
@Profile("CMD")
@SpringBootApplication
@EnableAutoConfiguration
public class JobApplication implements CommandLineRunner {
Logger logger = LoggerFactory.getLogger(JobApplication.class);
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(JobApplication.class, args);
context.close();
}
@Override
public void run(String... args) throws Exception {
// run the job
}
}
@Profile("WEB")
@SpringBootApplication
public class WebApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class, args);
}
}
您可以以java -jar /job/job.jar -Dspring.profiles.active=CMD
啟動命令行
和 web 配置文件 WEB。
因為@Profile
是一個運行時 spring 注釋,所以在加載 spring 上下文之前無法處理它,您將擁有(如您所見)
Unable to find a single main class from the following candidates [my.app.WebApplication, my.app.JobApplication]
因此,您可以使用以下命令啟動特定的 Spring Boot 主類
-Dstart-class=com.sample.WebApplication
現在它不應該加載第二個,因為現在@Profile
應該可以工作了
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.