具有两个入口点的 Spring Boot 应用程序:CLI 和 Web 服务

我有一个我创建的 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 是可以的......但我真的很想将所有代码保留在同一个项目中)?


PIPIONE
浏览 94回答 1
1回答

隔江千里

你试过尝试使用吗@Profile?例如:@Profile("CMD")@SpringBootApplication@EnableAutoConfigurationpublic 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")@SpringBootApplicationpublic 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应该工作
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java