Подтвердить что ты не робот

Spring Загрузка - как указать альтернативный начальный класс? (Множественные точки входа)

Я хочу добавить альтернативную точку входа в мое приложение Spring -Boot. Я бы предпочел сохранить это как толстую банку. Возможно ли это?

В соответствии с их документацией свойство loader.main указывает имя запускающего основного класса.

Я попробовал java -jar MyJar.jar --loader.main=com.mycompany.AlternateMain, но начальный класс, указанный в моем pom.xml, все еще выполнялся (и если я удалю это из pom.xml, то я ошибся во время упаковки).

В качестве альтернативы я попробовал java -cp MyJar.jar com.mycompany.AlternateMain, но я не знаю, как добавить все вложенные банки в путь к классам.

Любые предложения?

Изменить: вот решение, которое я использовал

Как предложил jst, я сменил свою программу запуска на использование свойстваLauncher. Я сделал это, изменив конфигурацию моего Spring -boot-maven-plugin.

<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <configuration>
    <mainClass>${start-class}</mainClass>
    <layout>ZIP</layout>
    ...

<layout>ZIP</layout> триггеры Spring Загрузите PropertiesLauncher.

Я создал свою толстую банку (пакет mvn), а затем назвал альтернативный главный файл следующим образом:

java -jar -Dloader.main=com.mycompany.AlternateMain MyJar.jar

Спасибо за помощь!

4b9b3361

Ответ 1

Я не считаю, что в вашем случае будет применяться свойство. Есть 3 разных "Пусковые установки" (вернитесь к документам и посмотрите). Если вы строите банку, она использует класс JarLauncher. Если вы переключите его на PropertiesLauncher, тогда будет полезен loader.main.

META-INF/MANIFEST.MF

Main-Class: org.springframework.boot.loader.PropertiesLauncher

Ответ 2

Я использовал другой подход и использовал параметр командной строки, чтобы определить, какой класс использовать в качестве класса SpringApplication. У меня есть только один метод main(), но разные классы приложений с различными конфигурациями, которые используются на основе параметра командной строки.

У меня есть один класс с main() в нем:

public static void main(String[] args) {
    SpringApplication app;
    if( ArrayUtils.contains(args, "--createdb")){
        app = new SpringApplication(CreateDB.class);
        args = (String[])ArrayUtils.add(args, "--spring.jpa.hibernate.ddl-auto=create");
    } else {
        app = new SpringApplication(Application.class);
    }

    app.setWebEnvironment(false);
    app.setShowBanner(false);
    app.addListeners(new ConfigurationLogger());

    // launch the app
    ConfigurableApplicationContext context = app.run(args);

    // finished so close the context
    context.close();
}

Но у меня есть два разных класса SpringApplication: Application.class и CreateDB.class. Каждый класс определяет другой путь @ComponentScan, а также различные опции @EnableAutoConfiguration и различные параметры @Configuration. Наконец, на основе аргументов командной строки, я могу решить, следует ли программно включать дополнительные профили/и т.д.

В моем случае я хочу, чтобы другая пусковая установка просто создала схему БД и выходила, поэтому я принудительно использовал параметр командной строки.

Ответ 3

Я бы предложил иметь один main, но используя профили Spring (или свойства конфигурации), чтобы выбрать тот или иной класс "точка входа" @Configuration.