2015-06-26 12 views
13

Chcę dodać alternatywny punkt wejścia do mojej aplikacji Spring-Boot. Wolałbym zachować to jako słoik tłuszczu. czy to możliwe?Spring Boot - Jak określić alternatywną klasę początkową? (Wiele punktów wejścia)

Zgodnie z ich documentation, właściwość loader.main określa nazwę głównej klasy do uruchomienia.

Wypróbowałem , ale klasa początkowa określona w moim pliku pom.xml nadal była uruchomiona (a jeśli usunę to z pliku pom.xml, to wystąpił błąd podczas pakowania).

Alternatywnie próbowałem java -cp MyJar.jar com.mycompany.AlternateMain, ale nie wiem o dobrym sposobie dodawania wszystkich zagnieżdżonych słoików do ścieżki klasy.

Wszelkie sugestie?

Edycja: Oto rozwiązanie, które użyłem

Jak jst zasugerował, zmieniłem wyrzutnię korzystania z PropertiesLauncher. Zrobiłem to, modyfikując konfigurację mojego wiosennego 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>triggers Spring Boot to use the PropertiesLauncher.

tworzę tłuszczu słoik (pakiet mvn), a następnie nazywa alternatywny main takiego:

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

Dzięki za pomoc!

+1

Spring Boot po prostu używa Manifestu JAR, aby określić główną klasę i klasę classpath.Więc myślę, że prawdziwym pytaniem jest tutaj, czy może być więcej niż jedna klasa główna w pliku wykonywalnym JAR? To pytanie jest również zadawane/odbierane tutaj: http://stackoverflow.com/q/3976514/953327 – FGreg

+0

Co zamierzasz osiągnąć z tym? Czy chcesz utworzyć wiele aplikacji z Spring Boot? – Makoto

+0

@FGreg I można uzyskać dostęp do alternatywnej sieci głównej za pomocą drugiego polecenia, które zanotowałem, które pasuje do odpowiedzi w wątku SO, do którego prowadzi łącze. Aby móc z powodzeniem używać tego, musiałbym dowiedzieć się, jak dodać zagnieżdżone słoiki do ścieżki klasy. –

Odpowiedz

8

Nie wierzę, że właściwość miałaby zastosowanie w twoim przypadku. Istnieją 3 różne "Launchery" (wróć do dokumentów i zobacz). Jeśli budujesz słoik, używa on klasy JarLauncher. Jeśli przełączysz go na PropertiesLauncher, przydatne będzie loader.main.

META-INF/MANIFEST.MF

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

Brzmi to bardzo obiecująco, ale moje wyniki są takie same. Aby użyć PropertiesLauncher, skonfigurowałem wtyczkę boot-maven-boot, jak opisano tutaj http://stackoverflow.com/a/21328440/2860319. Mogłem zobaczyć w moim manifeście, że zadziałało i właściwościLauncher był już używany, ale właściwość loader.main określona za pomocą wiersza poleceń nie zmieniła klasy początkowej ... hmmmm –

+0

Dodawałem właściwości niepoprawnie, będę aktualizować mój post z tym, co zrobiłem. Dzięki za wspaniałą sugestię! –

3

Sugerowałbym posiadanie pojedynczego main, ale używając profili Spring (lub właściwości konfiguracji), aby wybrać jedną lub inną klasę "entry point" @Configuration.

+1

Czy możesz podać przykład, proszę? – rmv

7

wziąłem innego podejścia i używać parametru wiersza polecenia, aby określić, która klasa użyć jako mojej klasie SpringApplication. Mam tylko jedną metodę main(), ale różne klasy aplikacji z różnymi konfiguracjami, które są używane w oparciu o parametr wiersza polecenia.

mam jedną klasę z main() w tym:

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(); 
} 

Ale mam 2 różne klasy SpringApplication: Application.class & CreateDB.class. Każda klasa definiuje inną ścieżkę @ComponentScan, a także różne opcje @EnableAutoConfiguration i różne opcje @Configuration. Wreszcie, w oparciu o moje argumenty wiersza poleceń, mogę zdecydować, czy programowo włączyć dodatkowe profile/etc.

W moim przypadku chcę, aby inny program uruchamiający po prostu utworzył schemat DB i zakończył działanie, więc wymusiłem parametr wiersza poleceń.

+0

To tam też szłam, prawdopodobnie "CreateDB' i" Application "istnieją w oddzielnych pakietach, dzięki czemu można użyć' @ ComponentScan' z 'basePackages' ustawionym w tym pakiecie? – ben3000

+2

Rzeczywiście jest to możliwe. W moim przypadku są one faktycznie w tym samym pakiecie, ale moje explicity '@ComponentScan()' ustawia różne pakiety podstawowe do skanowania z różnymi regułami wykluczania. Pozwala również na posiadanie różnych opcji '@AutoConfiguration()', różnych klas Config, itd. I szczerze mówiąc - znacznie łatwiej jest to zrobić, niż używać parametrów launchera i launchera w celu określenia długich nazw klas; to pozwala mi go dowolnie streścić. Zasadniczo zapakowałem dwie oddzielne aplikacje SpringBoot (które mają wspólne klasy) w tym samym słoiku. –