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