为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PIPIONE 2023-03-17 15:00:27
我有一个我创建的 spring-boot-starter 应用程序,它作为 CommandLineRunner 启动,在 Kubernetes 中作为 CronJob 运行,类似于:@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  }}我目前在这样的 Dockerfile 中运行应用程序,一切正常。CMD java -jar /job/job.jar在此应用程序中,有一些数据库代码和 DTO,我想将它们用作 Spring Web 服务并公开,最好在同一代码库中,这样我就不必创建多个 Github 存储库和 Java 项目并发布一个共享库使用。我想保持简单并且能够直接编译和使用它们。有没有办法做到这一点?我想我需要第二个 WebApplication 类,但我不确定如何执行它,所以它使用它而不是 Job。如果没有,是否有推荐的方法来做我想做的事情(如果这是唯一的方法,构建多个 jar 是可以的......但我真的很想将所有代码保留在同一个项目中)?
查看完整描述

1 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

你试过尝试使用吗@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应该工作


查看完整回答
反对 回复 2023-03-17
  • 1 回答
  • 0 关注
  • 71 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信