2015-04-21 2 views
10

Sto sviluppando un'app Web utilizzando Spring Boot. Il mio tipico deployment sta generando war e lo posto nella cartella webapps nella directory Tomcat.Perché ho bisogno del metodo principale se sviluppo un'applicazione web come guerra utilizzando Spring Boot?

Ho notato con SpringBoot, avrò bisogno di un metodo main. Mi chiedo perché è necessario. Se c'è un modo per evitarlo, quale sarebbe?

@SpringBootApplication 
public class Application extends SpringBootServletInitializer { 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(Application.class); 
    } 

    public static void main(String[] args) throws Exception { 
     SpringApplication.run(Application.class, args); 
    } 

} 
+0

Non penso che sia necessario un metodo principale se si desidera distribuire come guerra. Cosa succede se lo rimuovi? –

+0

Sì, non ne hai bisogno. Puoi rimuoverlo solo se si tratta sempre e solo di un file WAR che stai costruendo. – rhinds

+0

La parte cruciale della documentazione è "(...) si * aggiorna * la classe principale dell'applicazione per estendere SpringBootServletInitializer"; se cerchi nel resto di quella pagina le occorrenze di "public class Application", vedrai che si riferiscono semplicemente alla forma precedente di quella classe. – kryger

risposta

9

metodo Main non è richiesto per il tipico scenario di distribuzione della costruzione di una guerra e l'immissione nella cartella webapps di Tomcat. Tutto ciò che serve è:

public class Application extends SpringBootServletInitializer { 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(Application.class); 
    } 
} 

Tuttavia, se si vuole essere in grado di lanciare l'applicazione all'interno di un IDE (ad esempio con Eclipse Run As -> Java Application) durante lo sviluppo o build an executable jar or a war che può essere eseguito stand-alone con la Primavera di avvio di embedded tomcat con il solo comando java -jar myapp.war, potrebbe essere utile una classe entry point con un metodo main.

+0

+1. grazie per le informazioni. a cosa serve 'application.sources (Application.class)'? qual è il suo unico scopo? È necessario o può essere evitato? –

+0

Come per [JavaDoc del metodo] (http://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/builder/SpringApplicationBuilder.html#sources (java.lang.Class ...)), aggiunge più fonti (classi e componenti di configurazione) per Spring per la scansione dell'inizializzazione del contesto di questa applicazione. –

+0

Ho provato senza metodo principale e non funziona: eccolo: http://stackoverflow.com/questions/29831953/maven-build-failing-when-generating-war-package-for-spring-boot-application?noredirect = 1 # comment47793253_29831953 –

3

per l'esecuzione in un contenitore web separato

Non è necessario il metodo principale, tutto ciò che serve è quello di fare è di estendere SpringBootServletInitializer come Kryger menzionato.

@SpringBootApplication 
public class Application extends SpringBootServletInitializer { 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(Application.class); 
    } 
.... 
.... 

Per eseguire nella riga di comando come applicazione autonoma

Qui è necessario il metodo principale, in modo che è possibile eseguire utilizzando java -jar dalla riga di comando.

public class Application { 
    public static void main(String[] args){ 
     ConfigurableApplicationContext context = SpringApplication.run(Application.class, args); 
    } 
.... 
.... 

Fonte

: https://spring.io/guides/gs/convert-jar-to-war/

+0

Questo fa non funziona: per favore vedi questo post http: // StackOverflow.it/questions/29831953/maven-build-fail-in-generazione-war-package-per-spring-boot-application? noredirect = 1 # comment47793253_29831953 –

+0

nella versione 3.8.3, qual è l'alternativa a SpringBootServletInitializer? – user982

0

In Spring avvio uno sarà fondamentalmente bisogno di tre cose:

1) utilizzare il @SpringBootApplication nota

2) si estendono SpringBootServletInitializer

3) sovrascrivere il metodo di configurazione come mostrato sopra

e questo è tutto!