Приложение Spring Boot с двумя точками входа: CLI и веб-сервис - PullRequest
1 голос
/ 10 июля 2019

У меня есть приложение 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, в идеале внутри той же кодовой базы, поэтому мне не нужносоздайте несколько репозиториев Github и Java-проектов и опубликуйте совместно используемую библиотеку.Я хотел бы сделать это простым и просто иметь возможность компилировать и использовать их напрямую.

Есть ли способ сделать это?Я думаю, что мне нужен второй класс WebApplication, но тогда я не уверен, как его выполнить, поэтому он использует его вместо Job.

Если нет, есть ли рекомендуемый подход для выполнения того, что я хочусделать (создание нескольких jar-файлов - это нормально, если это единственный способ ... но я бы очень хотел сохранить весь код в одном проекте)?

1 Ответ

1 голос
/ 10 июля 2019

Вы пытались использовать @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.

Поскольку @Profile являетсяаннотация пружины во время выполнения, которую нельзя обработать, пока не будет загружен контекст пружины, у вас будет (как вы обнаружили)

Unable to find a single main class from the following candidates [my.app.WebApplication, my.app.JobApplication]

По этой причине вы можете запустить определенную главную загрузочную пружинукласс с

-Dstart-class=com.sample.WebApplication

И теперь он не должен загружать второй, потому что теперь @Profile должен работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...