簡體   English   中英

具有兩個入口點的 Spring Boot 應用程序:CLI 和 Web 服務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM