2015-06-26 4 views
13

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

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

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

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

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

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

Как предложил ПДжС я изменил свою пусковую использовать PropertiesLauncher. Я сделал это, изменив конфигурацию моего плагина spring-boot-maven.

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

<layout>ZIP</layout>triggers Spring Boot to use the PropertiesLauncher.

Я создал мой толстый сосуд (МВН пакет), то называется альтернативной магистраль, как это:

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

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

+1

Spring Boot просто использует манифест JAR для указания основного класса и пути к классам.Поэтому я думаю, что реальный вопрос здесь заключается в том, может ли быть более одного основного класса в исполняемом JAR? Этот вопрос также задан/здесь: http://stackoverflow.com/q/3976514/953327 – FGreg

+0

Что вы намерены выполнить с этим? Вы хотите создать несколько приложений из Spring Boot? – Makoto

+0

@FGreg Я могу получить доступ к альтернативному главному, используя вторую команду, которую я заметил, которая соответствует ответу в потоке SO, к которому вы ссылаетесь. Чтобы использовать это успешно, я должен был бы выяснить, как добавить мои вложенные банки в путь к классам. –

ответ

8

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

META-INF/MANIFEST.MF

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

Это звучит очень многообещающе, но мои результаты одинаковы. Чтобы использовать PropertyLauncher, я настроил плагин spring-boot-maven, как описано здесь http://stackoverflow.com/a/21328440/2860319. Я мог видеть в своем манифесте, что это сработало, и теперь используется свойство PropertiesLauncher, но свойство loader.main, указанное в командной строке, не изменило начальный класс ... hmmmm –

+0

Я добавлял свойства неправильно, я обновлю мой пост с тем, что я сделал. Спасибо за большое предложение! –

3

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

+1

Можете ли вы привести пример, пожалуйста? – rmv

7

я взял другой подход и использовать параметр командной строки, чтобы определить, какой класс использовать в качестве моего класса SpringApplication. У меня есть только один метод 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(); 
} 

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

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

+0

Здесь я тоже заголовок, предположительно, 'CreateDB' и' Application' существуют в отдельных пакетах, что позволяет вам использовать '@ ComponentScan' с' basePackages', установленным для этого пакета? – ben3000

+2

Действительно, это возможно. В моем случае они фактически находятся в одном пакете, но моя '@ComponentScan()' explicity устанавливает различные базовые пакеты для сканирования с различными правилами исключения. Он также позволяет вам иметь разные опции '@AutoConfiguration()', разные классы конфигурации и т. Д. И, откровенно говоря, мне гораздо проще это сделать, чем использовать параметры запуска и запуска для указания длинных имен классов; это позволяет мне абстрагировать его так, как я хочу. Я в основном упаковал 2 отдельных приложения SpringBoot (которые имеют общие классы) в одной банке. –

Смежные вопросы