Come si distribuiscono le applicazioni realizzate su Spring Boot? Perché IntelliJ non mi genera in automatico il .WAR?

di il
5 risposte

Come si distribuiscono le applicazioni realizzate su Spring Boot? Perché IntelliJ non mi genera in automatico il .WAR?

Ho provato a fare un piccolo "Hello World!" in Spring Boot cominciando da qualcosa di semplice e documentato:
https://spring.io/guides/gs/serving-web-content
1.Ho notato che il mio IDE (IntelliJ) non genera in automatico il file .war e vorrei capire se è una cosa normale oppure no.
Se creo un artifac io, sempre usando le impostazioni del programma, mi accorgo che l'IDE genera un file .war di 16GB ma quando lo carico sul server virtuale non funziona. Sbirciando nelle impostazioni del programma mi accorgo anche che è possibile generare .JAR e .APK.
2.Sull'IDE tutto funziona alla perfezione ma non riesco a settare la versione di Tomcat che deve usare Spring: è normale?
3.Con Spring Boot si possono anche creare .APK in automatico?
4.I .JAR potrebbero servirmi a qualcosa? Qualcuno li usa per le Web Application? Perché?
5.E' lecito scrivere nel file pom.xml il tag "<artifactId>SpringHelloWorld</artifactId>" se la directory che contiene tutti i file del progetto è stata nominata "06-SpringHelloWorld"?
6.Con Spring Boot quando avvio su run non mi si apre in automatico il browser e non apro in automatico localhost:8080 cosa che accadeva quando lavoravo su JSP.

5 Risposte

  • Re: Come si distribuiscono le applicazioni realizzate su Spring Boot? Perché IntelliJ non mi genera in automatico il .WAR?

    giannino1995 ha scritto:


    Ho notato che il mio IDE (IntelliJ) non genera in automatico il file .war e vorrei capire se è una cosa normale oppure no.
    Il punto e aspetto principale di Spring Boot è il fatto di creare applicazioni "standalone", non webapp nel senso del WAR di JavaEE.
    Si può anche fare il WAR ma serve "altro" nel pom.xml. Vedi la documentazione ufficiale:
    Packaging Executable Jar and War Files

    giannino1995 ha scritto:


    Se creo un artifac io, sempre usando le impostazioni del programma, mi accorgo che l'IDE genera un file .war di 16GB
    16GB ??? O forse 16MB ?
    Comunque non credo che dal IDE puoi "banalmente" creare tu il war (sicuramente NON se il pom rimane quello per app standalone).

    giannino1995 ha scritto:


    non riesco a settare la versione di Tomcat che deve usare Spring: è normale?
    Dovrebbe (se non sbaglio) bastare mettere nelle <properties> del pom qualcosa del tipo:

    <tomcat.version>9.0.5</tomcat.version>

    Comunque non credo che puoi mettere davvero "qualunque" versione che ti pare. L'artifact spring-boot-starter-tomcat è lui che si tira dentro altre dependency relative a tomcat come il tomcat-embed-core. Quindi le versioni possibili sono quelle di questi artifact.
    Quindi devi vedere se mettendo quella property ti tira dentro un'altra versione di queste dipendenze.

    giannino1995 ha scritto:


    Con Spring Boot si possono anche creare .APK in automatico?
    APK è "roba" di Android. Non ti so dire ... non credo (ma il "non credo" non è ovviamente sicuro al 100%)

    giannino1995 ha scritto:


    I .JAR potrebbero servirmi a qualcosa? Qualcuno li usa per le Web Application? Perché?
    Far girare l'applicazione come "standalone" non è così strano o sbagliato. Si usa tipicamente in fase di sviluppo e magari in testing vari. Poi magari per ambiente "produzione" si fanno altre scelte, chiaramente.

    giannino1995 ha scritto:


    E' lecito scrivere nel file pom.xml il tag "<artifactId>SpringHelloWorld</artifactId>" se la directory che contiene tutti i file del progetto è stata nominata "06-SpringHelloWorld"?
  • Re: Come si distribuiscono le applicazioni realizzate su Spring Boot? Perché IntelliJ non mi genera in automatico il .WAR?

    Grazie per risposta.
    Si, avevo già implementato quel codice ma non produceva nessun .war. Oggi smanettando ho trovato una spunta mancante nell’IDE. Aggiungendo questa spunta si è generato il .war nella cartella target automaticamente ma se lo testo continua a non funzionare.
    Ecco il messaggio di errore:
    Stato HTTP 404 - Non trovato
    Digitare il rapporto di stato
    Messaggio /
    Descrizione Il server di origine non ha trovato una rappresentazione corrente per la risorsa di destinazione o non è disposto a rivelare che esiste.
    Apache Tomcat / 9.0.17
    Interessante il discorso dell’applicazione stand-alone. Quindi se ho capito bene con il .jar potrei evitare di installare Tomcat sul server e risparmiare un bel po' di sacrificio? In locale uso Docker il .war mi è più comodo.
    Il .war che ho ora è di 12,1 MB (12.717.587 byte), scusa per prima, ho messo “qualche” MB di troppo.
    Ti mostro il mio pom, a me sembra corretto:
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>StringTest</groupId>
        <artifactId>SpringHelloWorld</artifactId>
        <version>1.0-Test</version>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.4.RELEASE</version>
        </parent>
        <packaging>war</packaging>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <optional>true</optional>
            </dependency>
        </dependencies>
        <properties>
            <java.version>1.8</java.version>
        </properties>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>
    Non mi pare che manchi nulla.
    Ho anche provato, per scrupolo, il .war sul server Tomcat che ho creato io senza Docker per timore che quello costruito in automatico da Docker non fosse compatibile. Purtroppo il .war non funziona da nessun parte.
    Con Docker ho Tomcat v.9.0.17 e Java v.1.11 quindi in teoria, correggimi se sbaglio, non dovrebbe essere un problema di compatibilità. Sto usando versioni tutto sommato recenti sia di Tomcat che di Java.
    Qui c'è scritto "JDK 1.8 or later":
    https://spring.io/guides/gs/serving-web-content
  • Re: Come si distribuiscono le applicazioni realizzate su Spring Boot? Perché IntelliJ non mi genera in automatico il .WAR?

    giannino1995 ha scritto:


    Si, avevo già implementato quel codice ma non produceva nessun .war. Oggi smanettando ho trovato una spunta mancante nell’IDE. Aggiungendo questa spunta si è generato il .war nella cartella target automaticamente ma se lo testo continua a non funzionare.
    La documentazione linkata prima è ragionevolmente chiara, ci sono 3 cose da fare:
    - cambiare il packaging a war
    - mettere il spring-boot-starter-tomcat come "provided" (perché nel war non serve!!)
    - fornire una estensione della classe SpringBootServletInitializer per fare l'override del configure

    giannino1995 ha scritto:


    Interessante il discorso dell’applicazione stand-alone. Quindi se ho capito bene con il .jar potrei evitare di installare Tomcat sul server e risparmiare un bel po' di sacrificio?
    Come app "standalone", il Tomcat (o altro servlet container supportato da Spring Boot come Jetty o Undertow) è già "embedded", incorporato.

    E va bene sicuramente in fase di sviluppo e per testing vari. Poi in un ambiente di "produzione" probabilmente no ma bisogna vedere dove è esposto il server, verso chi e come.
  • Re: Come si distribuiscono le applicazioni realizzate su Spring Boot? Perché IntelliJ non mi genera in automatico il .WAR?

    Nella guida si spiega come creare un file war non un file deployabile, per il secondo tipo di file war bisogna ancora fare questa modifica al main:
    https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war-file
    L'ultima frase non l'avevo proprio capita.
    Facendo la modifica ora funziona tutto, grazie mille per la traduzione.
    Comunque ci sono delle impostazioni sull'IDE da fare, non è tutto automatico.
    Su Eclipse e compagnia bella sarà anche peggio.
  • Re: Come si distribuiscono le applicazioni realizzate su Spring Boot? Perché IntelliJ non mi genera in automatico il .WAR?

    giannino1995 ha scritto:


    Nella guida si spiega come creare un file war non un file deployabile, per il secondo tipo di file war [...]
    Non esiste un "primo" e "secondo" tipo di WAR. Esiste il WAR e basta. Se non si riesce a fare il deploy di un war è perché gli manca qualcosa, mancano classi (tipico ClassNotFoundException), ha dei descrittori errati, ecc... e quindi il servlet container non fa proprio partire la webapp, come se non esistesse nel container.
Devi accedere o registrarti per scrivere nel forum
5 risposte