Esportare una webapp in Spring Boot in file .jar

di il
39 risposte

39 Risposte - Pagina 3

  • Re: Esportare una webapp in Spring Boot in file .jar

    Grazie per il plugin, molto facile da usare e grazie per la definizione di immagine e di container.
    Se nel container il .jar resta .jar significa che l'eventuale immagine aggiunta dalla webapp viene salvata nel container accanto al .jar. Questo mi convince sempre di più sulla necessità di creare un volume relativo alla cartella /demoapp.
    Un altro problema che mi viene in mente è l'aggiornamento della WebApp. Un conto è avere un volume per le immagini (/demoapp/immagini) ed un conto è avere un volume che comprende tutto anche il .jar. Nel secondo caso basta aprire WinSCP, cancellare il .jar vecchio e mettere quello nuovo. E' essenziale inserire in docker-compose il volume a /demoapp.
  • Re: Esportare una webapp in Spring Boot in file .jar

    Sono riuscito a creare il volume. In questo modo quando realizzerò un'app che eseguirà l'import delle immagini non dovrò ritornarci sopra ma non sono riuscito a creare un 'collegamento a calto' del .jar (credo che in gergo si dica così). In pratica cambiando il .jar, java tiene in memoria quanto letto nel precedente file .jar. Sapresti indicarmi una strategia per evitare di eliminare e ricreare il contenitore ogni volta che eseguo un aggiornamento all'app? Usando i layer di cui mi parlavi in precedenza il collegamento a caldo sarebbe fattibile o più agevole? Esiste qualche dipendenza di cui non ne conosco l'esistenza?
  • Re: Esportare una webapp in Spring Boot in file .jar

    Non ho potuto rispondere prima ma ora posso rispondere così: diciamo che la sostituzione "a caldo" dei jar non è una cosa particolarmente fattibile in Java. Detto in generale. Poi per dirla meglio, sono i classloader che hanno la capacità di caricare le classi e successivamente possono "scaricarle" via ma solo se: a) tutti i riferimenti alle classi vengono eliminati e b) anche il classloader viene garbage collected.
    Però NON stare a guardare queste cose, sono aspetti molto complessi e non ti conviene certo tirare in ballo anche queste cose ....

    La cosa più semplice è stoppare la applicazione, aggiornare il jar e riavviare. Per stoppare la applicazione ci sono svariati approcci, che possono variare anche in base al S.O. in uso. Spring Boot Actuator espone anche un endpoint per lo shutdown della applicazione ma il concetto essenziale è che questo endpoint ovviamente NON deve essere esposto "pubblicamente" (altrimenti buonanotte ....).
  • Re: Esportare una webapp in Spring Boot in file .jar

    Se oltre ad aggiungere questa dipendenza:
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    
    bastasse aggiungere una classe al progetto ed una pagina html si potrebbe fare ma sarebbe più carino se venisse fatto automaticamente da docker. Con Spring Security le pagine protette sono protette bene, non nutro questo timore.
    Nel caso del .war avrei avuto lo stesso problema oppure no?
  • Re: Esportare una webapp in Spring Boot in file .jar

    iBaffiPro ha scritto:


    bastasse aggiungere una classe al progetto ed una pagina html si potrebbe fare ma sarebbe più carino se venisse fatto automaticamente da docker.
    È un endpoint quello fornito da Actuator per lo shutdown .... è perfettamente possibile fare la request da shell/script usando es. curl o httpie.

    iBaffiPro ha scritto:


    Nel caso del .war avrei avuto lo stesso problema oppure no?
    Con un Tomcat a sé stante (NON embedded) le cose sono ben diverse, perché il Tomcat e le webapp sono molto più "controllabili". Innanzitutto, il Tomcat standard ha la porta 8005 che serve proprio per lo shutdown del server. Ma è anche possibile fare deploy/undeploy delle webapp SENZA stoppare il server, ad esempio tramite la applicazione "manager".
    E se ben ricordo, c'è pure un plugin Maven per fare questo durante il build con Maven.
  • Re: Esportare una webapp in Spring Boot in file .jar

    andbin ha scritto:


    È un endpoint quello fornito da Actuator per lo shutdown .... è perfettamente possibile fare la request da shell/script usando es. curl o httpie.
    Endpoint, curl, httpie, non so nulla di queste cose, non capisco nulla di quello che scrivi...
    Fisicamente cosa si tratta di fare, non riesco neppure a capire questo...

    andbin ha scritto:


    Con un Tomcat a sé stante (NON embedded) le cose sono ben diverse, perché il Tomcat e le webapp sono molto più "controllabili". Innanzitutto, il Tomcat standard ha la porta 8005 che serve proprio per lo shutdown del server. Ma è anche possibile fare deploy/undeploy delle webapp SENZA stoppare il server, ad esempio tramite la applicazione "manager".
    E se ben ricordo, c'è pure un plugin Maven per fare questo durante il build con Maven.
    Quindi una seconda opzione potrebbe essere quella di ritornare al .war? Su internet ho letto che si potrebbe usare 'spring-boot-devtools' anche in fase di produzione ma io penso che sarebbe una cattiva idea perché il caching è troppo importante.
    Avevo anche trovato un Dockerfile già pronto che invece di partire da java scaricava un'immagine di Maven e con questa creava dentro il contenitore il file .jar. Comunque era un Dockerfile complesso da comprendere e con molte righe di codice. Non riesco più a trovarlo maledizione... Però mi sembrava di aver letto che dopo che si avevano aggiornati i sorgenti della webapp bisognava comunque digitare qualche comando... insomma una complicazione inutile...
  • Re: Esportare una webapp in Spring Boot in file .jar

    iBaffiPro ha scritto:


    Endpoint, curl, httpie, non so nulla di queste cose, non capisco nulla di quello che scrivi...
    Fisicamente cosa si tratta di fare, non riesco neppure a capire questo...
    Va beh .... hai mai fatto request HTTP "a mano" usando es. Postman?

    iBaffiPro ha scritto:


    Quindi una seconda opzione potrebbe essere quella di ritornare al .war? Su internet ho letto che si potrebbe usare 'spring-boot-devtools' anche in fase di produzione ma io penso che sarebbe una cattiva idea perché il caching è troppo importante.
    spring-boot-devtools è stato pensato principalmente per la fase di sviluppo. Sarebbe meglio non usarlo in ambienti "reali".

    iBaffiPro ha scritto:


    Avevo anche trovato un Dockerfile già pronto che invece di partire da java scaricava un'immagine di Maven e con questa creava dentro il contenitore il file .jar. Comunque era un Dockerfile complesso da comprendere e con molte righe di codice. Non riesco più a trovarlo maledizione... Però mi sembrava di aver letto che dopo che si avevano aggiornati i sorgenti della webapp bisognava comunque digitare qualche comando... insomma una complicazione inutile...
    Fare un Dockerfile per usare Tomcat a sé stante con un war mi pare che sia anche più semplice (di più del Dockerfile che avevo mostrato in precedenza per .jar). Basta usare la immagine di Tomcat come "base" e poi piazzare il war nella webapps.
    Dovrebbero bastare 2 o 3 righe nel Dockerfile !!
  • Re: Esportare una webapp in Spring Boot in file .jar

    C'è un altro problema nell'usare il tuo Dockerfile:
    https://dzone.com/articles/spring-boot-secured-by-lets-encrypt
    ogni 90 giorni devo riavviare l'applicazione, uno sbattimento assurdo.
    Tu oppure il sistemista che gestisce i tuoi .jar rinnova ogni 90 giorni oppure ogni anno le tue app?
    In locale e su Google Cloud il mio progetto in docker-compose che usa il tuo Dockerfile funziona ma su Oracle Cloud no. Su Oracle Cloud ho un server che usa processori ARM. Potrebbe essere questo il problema?
    Con ARM va aggiunta qualche riga di codice al Dockerfile?
    Sono a pezzi... mi metterei a piangere... non riesco a pubblicare questa webapp in nessun modo e sono costretto a lanciare codici ogni 90 giorni perché resti in piedi oppure quando eseguo una modifica del .jar...
    Oggi provo a leggere qui:
    https://www.freenom.com/en/freeandpaiddomains.htm
    sembra che si possa acquisire un nome a dominio gratuito.
  • Re: Esportare una webapp in Spring Boot in file .jar

    iBaffiPro ha scritto:


    https://dzone.com/articles/spring-boot-secured-by-lets-encrypt
    ogni 90 giorni devo riavviare l'applicazione, uno sbattimento assurdo.
    Questa è tutta un'altra questione. E NON è detto che si debba per forza riavviare tutto.
    Purtroppo non conosco nei dettagli come funziona il Let's Encrypt (ce l'ho sul blog ma fa tutto l'hosting!). Cioè ... dovrei andare a leggere e "studiare" la documentazione, esattamente come farei per qualunque cosa "nuova" che affronto. E che dovresti fare anche tu ....

    Gestire tutto questo non viene "a gratis". Ci deve essere un po' di "infrastruttura" dietro. Gli hosting commerciali lo fanno automaticamente (mica devo andare io ogni 90 gg sul mio cPanel a fare qualcosa ...). Ma lo fanno avendo una certa infrastruttura e tutta una serie di logiche che sono o abbastanza standardizzate o fatte completamente custom. Non so ...

    Potrebbe venirmi il sospetto che magari per Spring Boot esista già una qualche libreria o magari un bel modulo "starter" per gestire proprio il Let's Encrypt o simile. Ma non saprei dire ora ...

    iBaffiPro ha scritto:


    In locale e su Google Cloud il mio progetto in docker-compose che usa il tuo Dockerfile funziona ma su Oracle Cloud no. Su Oracle Cloud ho un server che usa processori ARM. Potrebbe essere questo il problema?
    Con ARM va aggiunta qualche riga di codice al Dockerfile?
    Dovresti precisare cosa intendi per "non funziona". Non parte? Dà eccezioni? .....

    Il openjdk:11.0.15-jre-slim indicato c'è per piattaforme linux/amd64 e linux/arm64/v8. È ben indicato qui: https://hub.docker.com/_/openjdk?tab=tags&page=1&name=11.0.15-jre-slim
    Se non è una di queste due ... devi cambiare.
  • Re: Esportare una webapp in Spring Boot in file .jar

    Il problema del processore ARM l'ho risolto, non era colpa dell'immagine di Java ma dell'immagine di PostgreSQL.
    Nell'articolo c'è scritto:
    I assume the machine that you're working on is the one with running Spring Boot. It means that we're not done yet! The previous ‘keystore.p12’ is still in the memory, meaning that you need to restart your application!
    It's not always viable to simply restart a running application. There might be other ways to update it without restarting, but it's not in the scope of this post.
Devi accedere o registrarti per scrivere nel forum
39 risposte