Validare un form con o senza dipendenza. L'obiettivo è avere una WebApp che non richieda interventi nel breve periodo.

di il
13 risposte

Validare un form con o senza dipendenza. L'obiettivo è avere una WebApp che non richieda interventi nel breve periodo.

Ho un’applicazione su cui ho implementato questo script:
https://o7planning.org/11543/create-a-login-application-with-spring-boot-spring-security-spring-jdbc
ed ora sto cercando di aggiungere un form di registrazione preso da qui:
https://o7planning.org/11655/create-a-user-registration-application-with-spring-boot-spring-form-validation
Ci sono parecchie cose da sistemare ma credo prima di tutto il pom.xml.
Ogni volta che faccio un aggiornamento alla WebApp creo un nuovo progetto e questo per evitare di arrivare ad un punto di non ritorno.
Sul PC al momento ho una decina di versioni diverse dello stesso progetto:
01-spring-boot-security-jdbctemplate-thymeleaf
02-spring-boot-security-jdbctemplate-thymeleaf

10-spring-boot-security-jdbctemplate-thymeleaf

Da quando ho inserito un validatore sulla pagina relativa al form l’avvio del nuovo progetto dentro una nuova directory è diventato problematico. Il mio obiettivo è copiare la cartella src ed il file pom.xml dentro una nuova cartella, aprirli con l’IDE, lanciare la classe con il main() e poi procedere alle dovute modifiche.
Nel frattempo, ho anche deciso di creare un’applicazione con i moduli possibilmente più recenti possibili e questo sia per adeguarmi ai nuovi standard sia per evitare di ritrovarmi con un’applicazione che in futuro debba essere aggiornata.
Devo ammettere che con il nuovo pom.xml, con l’aggiornamento della variabile JAVA_HOME e MAVEN_HOME tutto funziona a meraviglia. Restano però dei dubbi su alcune scelte e su alcuni problemini che vorrei assolutamente risolvere.
1) Se lancio l’applicazione la WebApp parte senza problemi ma se poi digito nel terminale mvn clean install questa smette di funzionare e per farla ripartire devo cancellare la cartella target e farla ricreare all’IDE. Inoltre, il comando mvn clean install fornisce degli errori. Potrei aver sbagliato ad impostare qualche variabile d’ambiente? Perché accade questo?
2) Nel file pom.xml c’è la dipendenza commons-validator a cui devo dare assolutamente il numero della versione altrimenti quando faccio il processo che ho descritto sopra (copio src, pom.xml, avvio…) l’IDE non riesce a compilare l’applicazione, non parte e fornisce degli errori. A me non convince molto questo modulo e vorrei sapere se esiste qualcosa di meglio per fare una semplice convalida di un form. Non mi interessa in questo istante creare un’applicazione della NASA ma qualcosa di funzionale che possa durare il più possibile nel tempo. Se già ora bisogna ricordare a Maven la versione di questa dipendenza molto probabilmente in futuro potrebbe non essere più supportata così vorrei sapere cosa potrei usare in sostituzione. Vorrei qualcosa di semplice ma di avvalorato, semplice e possibilmente intramontabile.
3) Altra cosa che vi chiedo è se con questa nuova politica (prendo l’ultima JDK, l’ultima versione di Maven, l’ultima versione di Spring Boot, ecc…) potrei arrivare ad un punto in cui essere costretto a dover fare marcia indietro per qualche dipendenza ancora non disponibile con i nuovi strumenti di java. Ovviamente non devo fare nulla di complicato. L’obiettivo è realizzare un form di registrazione in cui gli utenti registrati possono fare cose in funzione dei ruoli loro assegnati.
4) Altra cosa che con capisco è se scrivere <artifactId>script</artifactId> è corretto oppure no dato che io cambio continuamente nome alla cartella del progetto. E’ giusto scrivere il tag sopra oppure dentro l’artifact devo mettere il nome della cartella che contiene la cartella src ed il file pom.xml?
5) Le varie dipendenze, jdk, plugin, framework, ecc… in fase di pubblicazione possono essere le ultimissime oppure sarebbe meglio che l’ultima cifra fosse pari? C’è qualche criterio da tenere sotto controllo?

pom.xml

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.5.0-SNAPSHOT</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>
   <groupId>it.webapp</groupId>
   <artifactId>script</artifactId>
   <version>3.0</version>
   <packaging>war</packaging>
   <name>script</name>
   <description>WebApp con Spring Boot, Security, Thymeleaf e PostgreSQL</description>
   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      <version.postgresql>11.4</version.postgresql>
      <java.version>1.16.0.1</java.version>
   </properties>
   <dependencies>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-security</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-thymeleaf</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
         <groupId>org.thymeleaf.extras</groupId>
         <artifactId>thymeleaf-extras-springsecurity5</artifactId>
      </dependency>
      <dependency>
         <groupId>org.postgresql</groupId>
         <artifactId>postgresql</artifactId>
         <scope>runtime</scope> 
      </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-test</artifactId>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>org.springframework.security</groupId>
         <artifactId>spring-security-test</artifactId>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-devtools</artifactId>
         <optional>true</optional>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-jdbc</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-validation</artifactId>
      </dependency>
      <dependency>
         <groupId>commons-validator</groupId>
         <artifactId>commons-validator</artifactId>
         <version>1.7</version>
      </dependency>
    </dependencies>
   <build>
      <pluginManagement>
         <plugins>
            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-compiler-plugin</artifactId>
               <version>3.8.1</version>
               <configuration>
                  <source>1.16.0.1</source>
                  <target>1.16.0.1</target>
                  <encoding>UTF-8</encoding>
               </configuration>
            </plugin>
         </plugins>
      </pluginManagement>
   </build>
   <repositories>
      <repository>
         <id>spring-milestones</id>
         <name>Spring Milestones</name>
         <url>https://repo.spring.io/milestone</url>
         <snapshots>
            <enabled>false</enabled>
         </snapshots>
      </repository>
      <repository>
         <id>spring-snapshots</id>
         <name>Spring Snapshots</name>
         <url>https://repo.spring.io/snapshot</url>
         <releases>
            <enabled>false</enabled>
         </releases>
      </repository>
   </repositories>
   <pluginRepositories>
      <pluginRepository>
         <id>spring-milestones</id>
         <name>Spring Milestones</name>
         <url>https://repo.spring.io/milestone</url>
         <snapshots>
            <enabled>false</enabled>
         </snapshots>
      </pluginRepository>
      <pluginRepository>
         <id>spring-snapshots</id>
         <name>Spring Snapshots</name>
         <url>https://repo.spring.io/snapshot</url>
         <releases>
            <enabled>false</enabled>
         </releases>
      </pluginRepository>
   </pluginRepositories>
</project>
mvn -version

Apache Maven 3.8.1 (05c21c65bdfed0f71a2f2ada8b84da59348c4c5d)
Maven home: D:\Java\apache-maven-3.8.1\bin\..
Java version: 16.0.1, vendor: Oracle Corporation, runtime: D:\Java\jdk-16.0.1
Default locale: it_IT, platform encoding: Cp1252
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
mvn clean install

[INFO] Scanning for projects...
[INFO]
[INFO] --------------------------< it.webapp:script >--------------------------
[INFO] Building script 3.0
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ script ---
[INFO] Deleting D:\...\Script-Internet\11-spring-boot-security-jdbctemplate-thymeleaf\target
[INFO]
[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ script ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Using 'UTF-8' encoding to copy filtered properties files.
[INFO] Copying 1 resource
[INFO] Copying 13 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ script ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 19 source files to D:\...\Script-Internet\11-spring-boot-security-jdbctemplate-thymeleaf\target\classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.618 s
[INFO] Finished at: 2021-05-04T00:16:14+02:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project script: Fatal error compiling: error: invalid target release: 1.1
6.0.1 -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

13 Risposte

  • Re: Validare un form con o senza dipendenza. L'obiettivo è avere una WebApp che non richieda interventi nel breve periodo.

    Non e' che si particolarmente chiaro quello che stai chiedendo.
    Anzi, per nulla.
    Anzi, diciamo pure che stai facendo un gran ""casino""

    1) se vuoi gestire PIU' VERSIONI della tua applicazione, invece di creare un nuovo progetto, si usano i ""versioning systems"", come GitHub, oppure te lo installi localmente come GitLab.

    2) non hai detto l'IDE che usi
    MA se usi IntelliJ Idea, SE crei un progetto basato su Maven, quel progetto FUNZIONA sia se usi Maven integrato nell'IDE, SIA se usi Maven da linea di comando, visto cheil Maven intergarto nell'IDE non e' altro che una normale installazione di Maven!
    SE non funziona, e' perche' stai facendo qualche pasticcio, quindi devi capire perche' in un caso va e nell'altro no.

    3) quando si inizia un progetto, si scelgono OPPORTUNAMENTE le versioni delle librerie e dei framework, e NON SI AGGIORNANO a meno che non sia STRETTAMENTE necessario.
    Fondamentalmente, NON SI RIMPIAZZA una libreria con l'ultima versione SOLO perche' ne e' uscita una nuova, MEN CHE MENO se cambia la PRIMA CIFRA.
    OVVIAMENTE niente e' assoluto, ma va fatto concognizione di causa. Ad esempio, non ci sono problemi se aggiorni una libreria con una in cui e' cambiata solo l'ULTIMA cifra, un po' piu' delicato se e' cambiata la SECONDA.

    Se per <artifactId>script</artifactId> stai indicato ESATTAMENTE script, E' SBAGLIATO, devi mettere un nome DECENTE.
    Se vuoi, il "groupId" e' come il cognome, "artifactId" e' come il nome e il numero di versione come l'eta'.
    Usare "script" e' come dire ""hei, tu"""

    In fase di pubblicazione devi mettere le versioni CHE HAI USATO PER LO SVILUPPO E CHE SAI PER CERTO CHE FUNZIONANO!

    4) c'e' il messaggio relativo alla versione di Java:
    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project script: Fatal error compiling: error: invalid target release: 1.1
    6.0.1 -> [Help 1]
    Non si capisce che acciderbolina stai combinando: vuoi usare Java 1.1? Java 6.0.1? Java 16.0.1 (piu' probabile)?
    Devi controllare cosa hai scritto nel pom.xml:
    
        <properties>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
        </properties>
    
    In ogni caso:

    NON SI USA MAI l'ultima versione di Java per un prodotto che dovra' essere distribuito, MA LA PIU' VECCHIA LTS ancora attiva e disponibile, o magari quella precedente. Il che vuol dire che dovresti usare Java 8 (anche se e' non piu' aggiornata MA infinitamente supportata) OPPURE java 11.

    Ci possono essere dei ""requirement"" legati a qualche libreria che ora viene compilata, ad esempio, con Java 11, QUINDI non puoi usare Java 8 ma DEVI usare Java 11.

    Il concetto e':
    - per TUO uso PERSONALE puoi anche usare l'ultimissima versione
    - per un prodotto per la distribuzione, DEVI ESSERE ESTREMAMENTE CONSERVATIVO
  • Re: Validare un form con o senza dipendenza. L'obiettivo è avere una WebApp che non richieda interventi nel breve periodo.

    iBaffiPro ha scritto:


    Ci sono parecchie cose da sistemare ma credo prima di tutto il pom.xml.
    Mi ha già preceduto migliorabile con ottimi consigli ma aggiungo comunque anche io un po' di cose perché nel tuo pom.xml ci sono svariate cose sbagliate, discutibili o semplicemente inutili. Cioè ... stai facendo un po' di pasticci ....

    iBaffiPro ha scritto:


    Ogni volta che faccio un aggiornamento alla WebApp creo un nuovo progetto e questo per evitare di arrivare ad un punto di non ritorno.
    Ci sono approcci 100 volte migliori, ad esempio usare un sistema di versionamento come Git. La cosa bella di Git è che puoi fare quasi tutto in "locale", anche senza un server di riferimento! Puoi fare i commit, branch, merge, discard delle modifiche ecc... tutto "offline". Poi chiaramente se hai il progetto su es. GitHub o Bitbucket, allora per push/pull ovviamente devi essere online e avere i riferimenti del repo remoto.
    Questo a differenza di altri sistemi come SVN che sono invece server "centrici", ovvero per qualunque cosa (anche un banale create branch) devi essere online e connesso al server altrimenti non fai un tubo ...

    iBaffiPro ha scritto:


    Nel frattempo, ho anche deciso di creare un’applicazione con i moduli possibilmente più recenti possibili e questo sia per adeguarmi ai nuovi standard sia per evitare di ritrovarmi con un’applicazione che in futuro debba essere aggiornata.
    Vedi quanto ti ha detto migliorabile. Non cercare di rincorrere sempre/solo l'ultimissima versione della tal libreria/framework X. La scelta delle versioni va fatta in maniera ragionata!

    iBaffiPro ha scritto:


    1) Se lancio l’applicazione la WebApp parte senza problemi ma se poi digito nel terminale mvn clean install questa smette di funzionare e per farla ripartire devo cancellare la cartella target e farla ricreare all’IDE. Inoltre, il comando mvn clean install fornisce degli errori. Potrei aver sbagliato ad impostare qualche variabile d’ambiente? Perché accade questo?
    Il problema-errore è come hai specificato la versione di Java.
    Allora: innanzitutto la property <java.version> è una cosa specifica di Spring Boot. Nei progetti Maven più tradizionali si usano di norma <maven.compiler.source> e <maven.compiler.target> .
    Perché in Spring Boot è diverso? Semplicemente perché Spring Boot "fattorizza" la gestione della versione più a monte. Il tuo pom ha un parente, spring-boot-starter-parent, se guardassi il pom di questo vedresti:

    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>

    Quindi è semplicemente un livello di indirezione di più e basta. Non solo: lì nel spring-boot-starter-parent ci sono GIÀ le property per il encoding (fisso a UTF-8), quindi nel tuo pom non servirebbe metterle.

    Comunque: tu hai messo <java.version>1.16.0.1</java.version>
    Questo è sbagliato!! Il source/target level in generale indica solo la versione di Java, NON la build di un JDK.

    Se usi Java 8 ---> <java.version>1.8</java.version> (oppure <java.version>8</java.version> )
    Se usi Java 11 ---> <java.version>11</java.version>
    Se usi Java 16 ---> <java.version>16</java.version>

    NON ha importanza se il JDK è un 1.8.0 build 281 o 291 o un 11.0.11 o un 16.0.1 .

    iBaffiPro ha scritto:


    2) Nel file pom.xml c’è la dipendenza commons-validator a cui devo dare assolutamente il numero della versione altrimenti quando faccio il processo che ho descritto sopra (copio src, pom.xml, avvio…) l’IDE non riesce a compilare l’applicazione, non parte e fornisce degli errori. A me non convince molto questo modulo e vorrei sapere se esiste qualcosa di meglio per fare una semplice convalida di un form.
    La Apache Commons Validator contiene solo una serie di classi e metodi di utilità che possono essere utili per validazioni particolari.
    Ma in ambito Spring Framework/Boot per la validazione si usa di norma la Java Validation API, di cui la Hibernate Validator è la implementazione standard.
    Ovvero, a livello pratico, si tratta di usare le varie annotation tipo @NotNull, @NotEmpty, @Size, @Min, ecc....

    Con Spring Boot è sufficiente avere il spring-boot-starter-validation (che hai!).

    iBaffiPro ha scritto:


    Vorrei qualcosa di semplice ma di avvalorato, semplice e possibilmente intramontabile.
    Nello sviluppo di software, non c'è niente di "intramontabile" ....

    iBaffiPro ha scritto:


    3) Altra cosa che vi chiedo è se con questa nuova politica (prendo l’ultima JDK, l’ultima versione di Maven, l’ultima versione di Spring Boot, ecc…) potrei arrivare ad un punto in cui essere costretto a dover fare marcia indietro per qualche dipendenza ancora non disponibile con i nuovi strumenti di java.
    Come già detto, non cercare di rincorrere solo l'ultimissima versione!

    iBaffiPro ha scritto:


    4) Altra cosa che con capisco è se scrivere <artifactId>script</artifactId> è corretto oppure no dato che io cambio continuamente nome alla cartella del progetto. E’ giusto scrivere il tag sopra oppure dentro l’artifact devo mettere il nome della cartella che contiene la cartella src ed il file pom.xml?
    Allora: il nome del progetto nel IDE e il artifactId tecnicamente possono anche differire, non è quello il problema.
    Il artifactId però dovrebbe avere un nome sensato ... non "script".
    Il groupId invece serve a raggruppare più artifact, tipicamente per rappresentare una azienda, un contesto o comunque un insieme di artifact correlati tra di loro.

    Io ad esempio sui miei progettini personali più recenti metto <groupId>it.andbin</groupId> perché? ... perché sono proprietario di andbin.it quindi nessun'altro può (lecitamente) dichiarare quel groupId.

    iBaffiPro ha scritto:


    5) Le varie dipendenze, jdk, plugin, framework, ecc… in fase di pubblicazione possono essere le ultimissime oppure sarebbe meglio che l’ultima cifra fosse pari? C’è qualche criterio da tenere sotto controllo?
    Non tutte le librerie/framework adottano uno schema di versionamento in cui i numeri "pari" indicano versioni stabili e quelli dispari no (lo fa o faceva il kernel di Linux).
    Per le librerie Java è più tipico usare il Semantic Versioning

    iBaffiPro ha scritto:


    
          <version.postgresql>11.4</version.postgresql>
    
    Questo non va bene, a parte il fatto che non lo stai usando concretamente.
    Il punto è che Spring Boot ha una opinione sulla versione di moltissime librerie a cui fa riferimento. Queste "opinioni" sono nel artifact spring-boot-dependencies (che è il parente di spring-boot-starter-parent).

    Nel spring-boot-dependencies si vede es.:

    <postgresql.version>42.2.19</postgresql.version>

    Questa è la versione che tirerebbe dentro se dichiari la dependency del driver SENZA mettere la versione.
    E nota: è la versione del driver, NON del server PostgreSQL !!
          <dependency>
             <groupId>org.postgresql</groupId>
             <artifactId>postgresql</artifactId>
             <scope>runtime</scope> 
          </dependency>
    Se vuoi ridefinire la versione, NON devi mettere <version> nel <dependency> ma devi ridefinire la property con lo stesso nome che usa Spring Boot, ovvero <postgresql.version>

    iBaffiPro ha scritto:


    <java.version>1.16.0.1</java.version>
    Già spiegato prima.

    iBaffiPro ha scritto:


                <plugin>
                   <groupId>org.apache.maven.plugins</groupId>
                   <artifactId>maven-compiler-plugin</artifactId>
                   <version>3.8.1</version>
                   <configuration>
                      <source>1.16.0.1</source>
                      <target>1.16.0.1</target>
                      <encoding>UTF-8</encoding>
                   </configuration>
                </plugin>
    Anche questo non ti serve se vai solo ad impostare quelle 3 configuration che sono GIÀ gestite da Spring Boot. Discorso diverso se dovessi impostare altro di molto più particolare nel <configuration> es. il <failOnWarning> o il <verbose> .

    iBaffiPro ha scritto:


       <repositories>
          <repository>
             <id>spring-milestones</id>
             <name>Spring Milestones</name>
             <url>https://repo.spring.io/milestone</url>
             <snapshots>
                <enabled>false</enabled>
             </snapshots>
          </repository>
          <repository>
             <id>spring-snapshots</id>
             <name>Spring Snapshots</name>
             <url>https://repo.spring.io/snapshot</url>
             <releases>
                <enabled>false</enabled>
             </releases>
          </repository>
       </repositories>
       <pluginRepositories>
          <pluginRepository>
             <id>spring-milestones</id>
             <name>Spring Milestones</name>
             <url>https://repo.spring.io/milestone</url>
             <snapshots>
                <enabled>false</enabled>
             </snapshots>
          </pluginRepository>
          <pluginRepository>
             <id>spring-snapshots</id>
             <name>Spring Snapshots</name>
             <url>https://repo.spring.io/snapshot</url>
             <releases>
                <enabled>false</enabled>
             </releases>
          </pluginRepository>
       </pluginRepositories>
    Ecco, chiariamo un attimo la questione delle snapshot/milestone.

    Per tutti i prodotti della famiglia Spring vengono rilasciate le release ufficiali e anche delle "snapshot" (istantanee in un certo momento) e le "milestone" (pietre miliari nello sviluppo di una certa nuova versione).

    Le release sono sui repo specifici di Spring ma ANCHE sul Maven Central ufficiale. Quindi non c'è bisogno di quei repository specifici.
    Le snapshot/milestone invece si trovano SOLO sui repo di Spring. Se tu vuoi qualcosa di perlomeno stabile e valido, allora DIMENTICA le snapshot/milestone!!
  • Re: Validare un form con o senza dipendenza. L'obiettivo è avere una WebApp che non richieda interventi nel breve periodo.

    X MIGLIORABILE
    1) Troppo complicato e non mi piace proprio delegare ad un software la gestione delle varie versioni di un mio progetto. Una versione differisce dalla precedenza per avere dei moduli in più (il form, la funzionalità https, ecc…) quindi mi mette comodo fare così. Nulla può superare la comodità delle cartelle. Comunque ti ringrazio molto per la dritta. Quando arrivo alla versione definitiva ci faccio un pensierino. Quando avrò finito questo lavoro butterò via tutte le precedenti versioni per cui non avrebbe molto senso cimentarsi ora su GitLab.
    2) Uso IntelliJ.
    Non è esattamente come scrivi. Per verificare che un pom.xml sia scritto correttamente bisogna ricreare un nuovo progetto.
    Esempio:
    Dentro la cartella X metto src e pom.xml e dentro il file xml scrivo questo:
          <dependency>
             <groupId>commons-validator</groupId>
             <artifactId>commons-validator</artifactId>
             <version>1.7</version>
          </dependency>
    Se avvio tutto funziona alla meraviglia.
    Se edito in questo modo il file xml:
          <dependency>
             <groupId>commons-validator</groupId>
             <artifactId>commons-validator</artifactId>
          </dependency>
    e poi uso il tasto aggiorna dell’IDE rilanciando l’applicazione mi accorgo che tutto funziona correttamente.
    Se dentro la cartella Y metto src e pom.xml editato ovvero con commons-validator senza il nome della versione non c’è verso di avviare l’applicazione e saltano fuori degli errori.
    Se edito nuovamente, dentro Y, il file pom.xml in questo modo:
          <dependency>
             <groupId>commons-validator</groupId>
             <artifactId>commons-validator</artifactId>
             <version>1.7</version>
          </dependency>
    tutto funziona alla perfezione. Se dentro Y riedito il pom.xml in questo modo:
          <dependency>
             <groupId>commons-validator</groupId>
             <artifactId>commons-validator</artifactId>
          </dependency>
    come per magia tutto funziona nuovamente nonostante l’errore.
    E’ evidente che con il mio IDE, se voglio essere sicuro che il pom.xml sia corretto devo ricreare il progetto.
    3) Ho capito, quindi il framework subisce modifiche del codice in funzione della JDK. Aggiornerò solo la prima cifra e non la seconda, grazie per l’utilissima informazione. Pensavo di usare JDK 11 perché online si trovano già molti esempi con questa JDK ma sono quasi certo che per le cose che faccio io la JDK 16 funzionerebbe uguale.
    4) Grazie per il consiglio, cambierò ‘script’ con qualcosa di più furbo. Stesso discorso per <groupId>it.webapp</groupId> ma al momento non ho ancora un dominio per cui non ha senso cambiare ora questi tag. Cambierò anche <artifactId>script</artifactId> ed il prefisso della classe con il main().
    5) Nel file pom.xml ho scelto di utilizzare 1.16.0.1. Nelle discussioni ho trovato questo:
        <properties>
            <maven.compiler.source>1.16.0.1</maven.compiler.source>
            <maven.compiler.target>1.16.0.1</maven.compiler.target>
        </properties>
    ma anche questo:
                   <configuration>
                      <source>1.16.0.1</source>
                      <target>1.16.0.1</target>
                      <encoding>UTF-8</encoding>
                   </configuration>
    X ANDBIN
    6) Non conosco Git ma non capisco bene a cosa serva, io faccio cose semplici (commit, branch, merge, discard, push/pull, server "centrici", create branch, non so neppure cosa siano).
    7) Di questo pom.xml che mi dite? Cambiereste ancora qualcosa? Non guardate <groupId>it.webapp</groupId>, <artifactId>script</artifactId>, <name>script</name> perché li cambierò quando e se riuscirò ad ultimare il progetto. Il dominio non costa caro ma senza l’applicazione ha poco senso.
    <?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.4.5</version>
    		<relativePath/>
    	</parent>
    	<groupId>it.webapp</groupId>
    	<artifactId>script</artifactId>
    	<version>3.0</version>
    	<packaging>war</packaging>
    	<name>script</name>
    	<description>WebApp con Spring Boot, Security, Thymeleaf e PostgreSQL</description>
    	<properties>
    		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    		<postgresql.version>42.2.20</postgresql.version>
    		<java.version>11</java.version>
    	</properties>
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-security</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-thymeleaf</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.thymeleaf.extras</groupId>
    			<artifactId>thymeleaf-extras-springsecurity5</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.postgresql</groupId>
    			<artifactId>postgresql</artifactId>
    			<scope>runtime</scope>
    		</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-test</artifactId>
    			<scope>test</scope>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.security</groupId>
    			<artifactId>spring-security-test</artifactId>
    			<scope>test</scope>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-devtools</artifactId>
    			<optional>true</optional>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-jdbc</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-validation</artifactId>
    		</dependency>
        </dependencies>
    	<build>
    		<pluginManagement>
    			<plugins>
    				<plugin>
    					<groupId>org.apache.maven.plugins</groupId>
    					<artifactId>maven-compiler-plugin</artifactId>
    				</plugin>
    			</plugins>
    		</pluginManagement>
    	</build>
    </project>
    8) Sia che imposto JDK 8 che JDK 11 ottengo sempre l’errore seguente ma JAVA_HOME e MAVEN_HOME sono correttamente impostate. Perché ottengo questo errore nell’installazione pulita di Maven (mvn clean install)?
    [INFO] BUILD FAILURE
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  39.232 s
    [INFO] Finished at: 2021-05-09T00:49:06+02:00
    [INFO] ------------------------------------------------------------------------
    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test (default-test) on project script: There are test failures.
    [ERROR]
    [ERROR] Please refer to D:\DATI\Script-Internet\10-spring-boot-security-jdbctemplate-thymeleaf\target\surefire-reports for the individual test results.
    [ERROR] Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
    [ERROR] The forked VM terminated without properly saying goodbye. VM crash or System.exit called?
    [ERROR] Command was cmd.exe /X /C ""C:\Program Files\Java\jdk1.8.0_291\jre\bin\java" -jar C:\Users\fra\AppData\Local\Temp\surefire5753103424334182480\surefirebooter7380411049446796407.jar
     C:\Users\fra\AppData\Local\Temp\surefire5753103424334182480 2021-05-09T00-48-29_714-jvmRun1 surefire1685057486743445964tmp surefire_07640676000483896057tmp"
    [ERROR] Process Exit Code: 0
    [ERROR] org.apache.maven.surefire.booter.SurefireBooterForkException: The forked VM terminated without properly saying goodbye. VM crash or System.exit called?
    [ERROR] Command was cmd.exe /X /C ""C:\Program Files\Java\jdk1.8.0_291\jre\bin\java" -jar C:\Users\fra\AppData\Local\Temp\surefire5753103424334182480\surefirebooter7380411049446796407.jar
     C:\Users\fra\AppData\Local\Temp\surefire5753103424334182480 2021-05-09T00-48-29_714-jvmRun1 surefire1685057486743445964tmp surefire_07640676000483896057tmp"
    [ERROR] Process Exit Code: 0
    [ERROR]         at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:669)
    [ERROR]         at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:282)
    [ERROR]         at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:245)
    [ERROR]         at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1183)
    [ERROR]         at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1011)
    [ERROR]         at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:857)
    [ERROR]         at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
    [ERROR]         at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210)
    [ERROR]         at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156)
    [ERROR]         at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148)
    [ERROR]         at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
    [ERROR]         at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
    [ERROR]         at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
    [ERROR]         at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
    [ERROR]         at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
    [ERROR]         at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
    [ERROR]         at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
    [ERROR]         at org.apache.maven.cli.MavenCli.execute(MavenCli.java:957)
    [ERROR]         at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:289)
    [ERROR]         at org.apache.maven.cli.MavenCli.main(MavenCli.java:193)
    [ERROR]         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    [ERROR]         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    [ERROR]         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    [ERROR]         at java.lang.reflect.Method.invoke(Method.java:498)
    [ERROR]         at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282)
    [ERROR]         at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225)
    [ERROR]         at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406)
    [ERROR]         at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347)
    [ERROR]
    [ERROR] -> [Help 1]
    [ERROR]
    [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
    [ERROR] Re-run Maven using the -X switch to enable full debug logging.
    [ERROR]
    [ERROR] For more information about the errors and possible solutions, please read the following articles:
    [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
    D:\DATI\Script-Internet\10-spring-boot-security-jdbctemplate-thymeleaf>
    
  • Re: Validare un form con o senza dipendenza. L'obiettivo è avere una WebApp che non richieda interventi nel breve periodo.

    iBaffiPro ha scritto:


    1) Troppo complicato e non mi piace proprio delegare ad un software la gestione delle varie versioni di un mio progetto. [....] Nulla può superare la comodità delle cartelle.
    È evidente che non conosci i sistemi di "versionamento" .....

    iBaffiPro ha scritto:


          <dependency>
             <groupId>commons-validator</groupId>
             <artifactId>commons-validator</artifactId>
          </dependency>
    La commons-validator non so ora dire se viene usata da qualche libreria a sua volta usata da Spring Boot ma sicuramente non è una dependency managed ("gestita") da Spring Boot nel spring-boot-dependencies.

    Lo ripeto ancora: il tuo progetto ha come parente spring-boot-starter-parent e questo ha a sua volta come parente spring-boot-dependencies. Qui in quest'ultimo c'è il <dependencyManagement> che serve a fornire le dichiarazioni per così dire "teoriche" di tutte le librerie su cui Spring Boot ha delle "opinioni" (su versioni, ecc...).

    Il pom di un spring-boot-dependencies lo puoi vedere qui (ma puoi arrivare a vederlo anche con un IDE): https://repo1.maven.org/maven2/org/springframework/boot/spring-boot-dependencies/2.4.5/spring-boot-dependencies-2.4.5.pom

    Siccome la versione di commons-validator non è "gestita" da Spring Boot, la devi mettere tu. Se non la specifichi, ti becchi un errore da Maven e quindi non fai alcun build .. punto.

    iBaffiPro ha scritto:


    5) Nel file pom.xml ho scelto di utilizzare 1.16.0.1. Nelle discussioni ho trovato questo:
        <properties>
            <maven.compiler.source>1.16.0.1</maven.compiler.source>
            <maven.compiler.target>1.16.0.1</maven.compiler.target>
        </properties>
    ma anche questo:
                   <configuration>
                      <source>1.16.0.1</source>
                      <target>1.16.0.1</target>
                      <encoding>UTF-8</encoding>
                   </configuration>
    Quelle versioni sono SBAGLIATE! L'ho già detto prima: nel <java.version> (specifico Spring Boot) o in generale <maven.compiler.source>/ <maven.compiler.target> (o ancora <source>/<target> direttamente sul maven-compiler-plugin) va messa la versione "pura" di Java, NON la build/release di un JDK.

    Questi valori sono gli equivalenti che si passano al javac con le opzioni -source/-target (o -release da JDK 9). Se guardi la pagina di help del javac del JDK11: https://docs.oracle.com/en/java/javase/11/tools/javac.html

    Per la opzione -source dice che puoi mettere:
    • 1.6 (oppure 6 )
    • 1.7 (oppure 7 )
    • 1.8 (oppure 8 )
    • 9
    • 10
    • 11

    SOLO queste. Stop. Se metti altro (es. 11.0.11 o 1.16.0.1), ti becchi un errore e non compili un bel niente ..

    iBaffiPro ha scritto:


    6) Non conosco Git ma non capisco bene a cosa serva, io faccio cose semplici (commit, branch, merge, discard, push/pull, server "centrici", create branch, non so neppure cosa siano).
    Pazienza ....

    iBaffiPro ha scritto:


    7) Di questo pom.xml che mi dite? Cambiereste ancora qualcosa?
    Non vedo nulla di palesemente "errato".

    Diciamo comunque che:

    1. <project.build.sourceEncoding> e <project.reporting.outputEncoding> sono superflui perché sono già definiti nel spring-boot-starter-parent

    2. non capisco perché ti interessa davvero ridefinire postgresql.version a 42.2.20. La versione managed (gestita) da Spring Boot 2.4.5 è la 42.2.19 (la vedi nel pom linkato prima del spring-boot-dependencies). Che ti cambia tra 42.2.19 e 42.2.20 ?? Comunque va bene, NON è un problema, sia chiaro!

    iBaffiPro ha scritto:


    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test (default-test) on project script: There are test failures.
    [ERROR]
    [ERROR] Please refer to D:\DATI\Script-Internet\10-spring-boot-security-jdbctemplate-thymeleaf\target\surefire-reports for the individual test results.
    [ERROR] Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
    [ERROR] The forked VM terminated without properly saying goodbye. VM crash or System.exit called?
    [ERROR] Command was cmd.exe /X /C ""C:\Program Files\Java\jdk1.8.0_291\jre\bin\java" -jar C:\Users\fra\AppData\Local\Temp\surefire5753103424334182480\surefirebooter7380411049446796407.jar
     C:\Users\fra\AppData\Local\Temp\surefire5753103424334182480 2021-05-09T00-48-29_714-jvmRun1 surefire1685057486743445964tmp surefire_07640676000483896057tmp"
    [ERROR] Process Exit Code: 0
    Non saprei ... potrebbe essere un problema del maven-surefire-plugin (che serve per gli unit-test) o qualcosa di corrotto. Domanda: hai delle classi di test? e (se sì) fanno cosa?

    Comunque segui il suggerimento di Maven:
    [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
    [ERROR] Re-run Maven using the -X switch to enable full debug logging.

    ovvero rilancia il mvn usando anche -e -X
    E vedi cosa dice di più.

    In ogni caso un'altra questione è che hai usato il install. Domanda: ti è chiaro cosa fa: mvn install ??
  • Re: Validare un form con o senza dipendenza. L'obiettivo è avere una WebApp che non richieda interventi nel breve periodo.

    Grazie mille, gentilissimo.
    Ho corretto il pom.xml come da tuo consiglio:
    <?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.4.5</version>
    		<relativePath/>
    	</parent>
    	<groupId>it.webapp</groupId>
    	<artifactId>script</artifactId>
    	<version>3.0</version>
    	<packaging>war</packaging>
    	<name>script</name>
    	<description>WebApp con Spring Boot, Security, Thymeleaf e PostgreSQL</description>
    	<properties>
    		<java.version>11</java.version>
    	</properties>
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-security</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-thymeleaf</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.thymeleaf.extras</groupId>
    			<artifactId>thymeleaf-extras-springsecurity5</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.postgresql</groupId>
    			<artifactId>postgresql</artifactId>
    			<scope>runtime</scope>
    		</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-test</artifactId>
    			<scope>test</scope>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.security</groupId>
    			<artifactId>spring-security-test</artifactId>
    			<scope>test</scope>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-devtools</artifactId>
    			<optional>true</optional>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-jdbc</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-validation</artifactId>
    		</dependency>
        </dependencies>
    	<build>
    		<pluginManagement>
    			<plugins>
    				<plugin>
    					<groupId>org.apache.maven.plugins</groupId>
    					<artifactId>maven-compiler-plugin</artifactId>
    				</plugin>
    			</plugins>
    		</pluginManagement>
    	</build>
    </project>
    Così va meglio?
    Se lancio questi comandi:
    mvn clean install -e 
    mvn clean install -X
    mvn clean install -e -X
    mvn clean install -X -e
    ottengo sempre lo stesso errore (ci sono dei test che falliscono). Non trovo nulla di utile:
    ...
    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test (default-test) on project script: There are test failures.
    [ERROR]
    [ERROR] Please refer to D:\DATI\Script-Internet\10-spring-boot-security-jdbctemplate-thymeleaf\target\surefire-reports for the individual test results.
    [ERROR] Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
    [ERROR] The forked VM terminated without properly saying goodbye. VM crash or System.exit called?
    [ERROR] Command was cmd.exe /X /C "D:\ALTRO\Java\jdk-11.0.11\bin\java -jar C:\Users\fra\AppData\Local\Temp\surefire9163627985868584676\surefirebooter6272538766038993585.jar C:\Users\fra\Ap
    pData\Local\Temp\surefire9163627985868584676 2021-05-09T14-54-22_322-jvmRun1 surefire16625716503443550310tmp surefire_06118788140978587711tmp"
    [ERROR] Process Exit Code: 0
    [ERROR] org.apache.maven.surefire.booter.SurefireBooterForkException: The forked VM terminated without properly saying goodbye. VM crash or System.exit called?
    [ERROR] Command was cmd.exe /X /C "D:\ALTRO\Java\jdk-11.0.11\bin\java -jar C:\Users\fra\AppData\Local\Temp\surefire9163627985868584676\surefirebooter6272538766038993585.jar C:\Users\fra\Ap
    pData\Local\Temp\surefire9163627985868584676 2021-05-09T14-54-22_322-jvmRun1 surefire16625716503443550310tmp surefire_06118788140978587711tmp"
    [ERROR] Process Exit Code: 0
    [ERROR]         at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:669)
    [ERROR]         at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:282)
    [ERROR]         at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:245)
    [ERROR]         at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1183)
    [ERROR]         at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1011)
    [ERROR]         at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:857)
    [ERROR]         at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
    [ERROR]         at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210)
    [ERROR]         at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156)
    [ERROR]         at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148)
    [ERROR]         at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
    [ERROR]         at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
    [ERROR]         at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
    [ERROR]         at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
    [ERROR]         at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
    [ERROR]         at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
    [ERROR]         at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
    [ERROR]         at org.apache.maven.cli.MavenCli.execute(MavenCli.java:957)
    [ERROR]         at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:289)
    [ERROR]         at org.apache.maven.cli.MavenCli.main(MavenCli.java:193)
    [ERROR]         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    [ERROR]         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    [ERROR]         at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    [ERROR]         at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    [ERROR]         at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282)
    [ERROR]         at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225)
    [ERROR]         at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406)
    [ERROR]         at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347)
    [ERROR]
    ...
    Maven è un software che scarica da Internet le dipendenze che servono per un dato progetto.
    “mvn clean install” cancella il contenuto della cartella “target” se presente, legge le dipendenze che il programmatore ha indicato nel pom.xml e le scarica dentro la cartella target sopracitata. Se alcune dipendenze per funzionare necessitano di altre dipendenze provvede a scaricarle in autonomia senza obbligatoriamente che esse siano presenti nel file pom.xml.
    Se tutto funziona a meraviglia non c’è necessità di usare “mvn clean install” in quanto l’IDE pensa a creare in autonomia la cartella target contenente le classi e le dipendenze necessarie alla WebApp per funzionare.
    Il fatto che “mvn clean install” lasci degli errori può significare che l’IDE sta creando una cartella “target” e quindi anche un file .war con qualche errore.
    Se lancio questo comando dal prompt di Windows:
    mvn clean install > log-file.log
    non vedo più alcun errore.
    Stesso discorso se uso il prompt di Windows 10.
    Non capisco perché accade questo.
    Si, ho una classe di Test di questo tipo:
    package it.webapp.script;
    
    import it.webapp.script.database_jdbc.*;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    
    import java.util.List;
    
    import static org.junit.jupiter.api.Assertions.*;
    
    @SpringBootTest
    class ScriptApplicationTests {
    
    	@Test
    	void contextLoads() {
    	}
    
    	@Autowired
    	private UtenteRepository utenteRepository;
    
    	@Autowired
    	private RuoloRepository ruoloRepository;
    
    	@Autowired
    	private UtenteRuoloRepository utenteRuoloRepository;
    
    	@Test
    	public void trovaTuttiGliUtenti()  {
    		List<Utente> utenti = utenteRepository.trovaTutti();
    		assertNotNull(utenti);
    		assertTrue(!utenti.isEmpty());
    	}
    
    	@Test
    	public void InserisciTrovaModificaCancellaUtente() {
    		Long id = 0L;
    		String nome = "utente-indesiderato";
    		String password = "password";
    		Boolean abilitato = false;
    		Utente utente = new Utente(id, nome, password, abilitato);
    		Utente utenteSalvato = utenteRepository.inserisciUtente(utente);
    		Utente nuovoUtenteDaId = utenteRepository.trovaUtente(utenteSalvato.getId());
    		Utente nuovoUtenteDaNome = utenteRepository.trovaUtente(utenteSalvato.getNome());
    		assertEquals(nome, nuovoUtenteDaId.getNome());
    		assertEquals(password, nuovoUtenteDaId.getPassword());
    		assertEquals(abilitato, nuovoUtenteDaId.getAbilitato());
    		assertEquals(nome, nuovoUtenteDaNome.getNome());
    		assertEquals(password, nuovoUtenteDaNome.getPassword());
    		assertEquals(abilitato, nuovoUtenteDaNome.getAbilitato());
    		String nuovoNome = "utente-indesiderato-2";
    		nuovoUtenteDaId.setNome(nuovoNome);
    		Long recordModificati = utenteRepository.modificaUtente(nuovoUtenteDaId);
    		assertEquals(recordModificati, 1L);
    		assertEquals(nuovoUtenteDaId.getNome(), utenteRepository.trovaUtente(nuovoNome).getNome());
    		assertEquals(nuovoUtenteDaId.getPassword(), utenteRepository.trovaUtente(nuovoNome).getPassword());
    		assertEquals(nuovoUtenteDaId.getAbilitato(), utenteRepository.trovaUtente(nuovoNome).getAbilitato());
    		Long idCancellati = utenteRepository.cancellaUtente(utenteSalvato.getId());
    		assertEquals(idCancellati, 1L);
    	}
    
    	@Test
    	public void trovaTuttiIRuoli()  {
    		List<Ruolo> ruoli = ruoloRepository.trovaTutti();
    		assertNotNull(ruoli);
    		assertTrue(!ruoli.isEmpty());
    	}
    
    	@Test
    	public void trovaRuoliUtente()  {
    		Long idUtente = 1L;
    		List<String> ruoliUtente = ruoloRepository.trovaRuoliUtente(idUtente);
    		Utente utente = utenteRepository.trovaUtente(idUtente);
    		System.out.println("L'utente " + utente.getNome() + " ha " + ruoliUtente.size() + " ruoli.");
    		assertNotNull(ruoliUtente);
    		assertTrue(!ruoliUtente.isEmpty());
    	}
    
    	@Test
    	public void trovaIdRuoliUtente()  {
    		Long idUtente = 1L;
    		List<Long> ruoliUtente = ruoloRepository.trovaIdRuoliUtente(idUtente);
    		Utente utente = utenteRepository.trovaUtente(idUtente);
    		System.out.println("L'utente " + utente.getNome() + " ha " + ruoliUtente.size() + " ruoli.");
    		assertNotNull(ruoliUtente);
    		assertTrue(!ruoliUtente.isEmpty());
    	}
    
    	@Test
    	public void InserisciTrovaModificaCancellaRuolo() {
    		Long id = 0L;
    		String nomeRuolo = "ruolo-indesiderato";
    		Ruolo ruolo = new Ruolo(id, nomeRuolo);
    		Ruolo ruoloSalvato = ruoloRepository.inserisciRuolo(ruolo);
    		Ruolo nuovoRuoloDaId = ruoloRepository.trovaRuolo(ruoloSalvato.getId());
    		Ruolo nuovoRuoloDaNome = ruoloRepository.trovaRuolo(ruoloSalvato.getRuolo());
    		assertEquals(nomeRuolo, nuovoRuoloDaId.getRuolo());
    		assertEquals(nomeRuolo, nuovoRuoloDaNome.getRuolo());
    		String nuovoRuolo = "ruolo-indesiderato-2";
    		nuovoRuoloDaId.setRuolo(nuovoRuolo);
    		Long recordModificati = ruoloRepository.modificaRuolo(nuovoRuoloDaId);
    		assertEquals(recordModificati, 1L);
    		assertEquals(nuovoRuoloDaId.getRuolo(), ruoloRepository.trovaRuolo(nuovoRuolo).getRuolo());
    		Long idCancellati = ruoloRepository.cancellaRuolo(ruoloSalvato.getId());
    		assertEquals(idCancellati, 1L);
    	}
    
    	@Test
    	public void AssegnaRimuoviRuoloAdUtente() {
    		UtenteRuolo utenteRuolo = new UtenteRuolo(2L, 1L);
    		UtenteRuolo CoppiaInserita = utenteRuoloRepository.inserisciRuoloAdUtente(utenteRuolo);
    		assertEquals(CoppiaInserita.getId_utente(), utenteRuolo.getId_utente());
    		assertEquals(CoppiaInserita.getId_ruolo(), utenteRuolo.getId_ruolo());
    		Long recordCancellati = utenteRuoloRepository.cancellaRuoloAdUtente(CoppiaInserita);
    		assertEquals(recordCancellati, 1L);
    	}
    
    	@Test
    	public void GestisciUtenteInesistente() {
    		String nome = "23-04-2021-20:00";
    		Utente utente = new Utente();
    		try {
    			utente = utenteRepository.trovaUtente(nome);
    		} catch(Exception e) {
    			assertEquals("null", "null");
    			return;
    		}
    		assertEquals(utente.getNome(), nome);
    		nome = "pro1";
    		try {
    			utente = utenteRepository.trovaUtente(nome);
    		} catch(Exception e) {
    			assertEquals("null", "null");
    			return;
    		}
    		assertEquals(utente.getNome(), nome);
    	}
    
    }
    In pratica verifico il funzionamento dei metodi che uso per gestire il DBMS.
  • Re: Validare un form con o senza dipendenza. L'obiettivo è avere una WebApp che non richieda interventi nel breve periodo.

    iBaffiPro ha scritto:


    Se tutto funziona a meraviglia non c’è necessità di usare “mvn clean install” ovvero non serve eseguire una disinstallazione di Maven ed una successiva reinstallazione. Il fatto che “mvn clean install” non funzioni significa che l’installazione della versione di Maven indicata in MAVEN_HOME non avviene nella maniera corretta.
    Ma allora NON hai proprio capito cosa fa mvn install !!!

    Questo "install" (e pure "clean") non c'entra assolutamente nulla con la installazione di Maven, cioè di dove/come è stato installato e configurato nel sistema!

    Sulla macchina locale, Maven mantiene memorizzate tutte le dipendenze che man mano scarica dai vari repository remoti (es. il Maven Central o quello di Spring, per dire) all'interno di una struttura di directory la cui locazione base varia da S.O. a S.O. Sui Windows si trova di norma sotto C:\Users\nomeutente\.m2
    Questo è quello che viene normalmente indicato come il repository "locale" di Maven.

    La fase di install è una fase eseguita dopo la fase di package. Ovvero: prima Maven "impacchetta" il progetto in jar/war/ecc... (nel TUO caso è un war perché c'è <packaging>war</packaging> ), poi la fase di install semplicemente va depositare questo artifact, ovvero il TUO war, dentro il repository locale.

    Ora pensa: ti serve? Nel tuo caso ragionevolmente no. La tua è una applicazione "finale", non è una libreria, quindi nessun altro progetto avrebbe quel TUO artifact come "dipendenza". E pertanto non serve che finisca nel repo locale.

    Studia: Introduction to the Build Lifecycle

    iBaffiPro ha scritto:


    Si, ho una classe di Test di questo tipo:
    In pratica verifico il funzionamento dei metodi che uso per gestire il DBMS.
    Per cominciare, non è così che si fanno i test. La questione principale innanzitutto è che quei repository sono quelli "reali" che vanno davvero su un DB.
    Allora, prima regola: la base dati tipicamente NON si testa!!! Quello che si fa normalmente è "staccare" i repository reali mettendo al loro posto dei "mock" (oggetti fittizi che puoi pilotare tu) e poi testare gli strati di sopra (es. solo uno strato di service oppure anche più sopra).

    Se proprio si vuole arrivare a testare l'accesso reale al DB allora questo diventa più un "integration test" invece che uno "unit test". E se vuoi arrivare ad un DB reale allora ci deve essere una base dati SPECIFICA per i test che va preparata e pulita prima di ogni singolo test. E questa base dati NON può essere quella di sviluppo e meno che mai assolutamente nemmeno quella di "produzione".

    Altrimenti puoi solo fare test tipo "trova tutti, poi basta che la lista non sia vuota" e un test del genere ha un "valore" davvero molto scarso.
  • Re: Validare un form con o senza dipendenza. L'obiettivo è avere una WebApp che non richieda interventi nel breve periodo.

    Scusa AndBin, mentre editavo il post tu stavi già rispondendo.
    Ti allego il file .log. E’ un documento grandissimo.
    https://uploadfiles.net/cry/log-file.lo
    Tutto chiaro ma credo che install oltre a copiare il .war dentro il recository locale lo crei anche dentro la cartella del progetto. Forse esiste qualcosa di analogo ad install che crea il war solo dentro la cartella del progetto. Comunque penso che non abbia molto senso preoccuparsi troppo di questo fatto. Conviene far fare tutto all’IDE e se ci sono problemi invece di usare mvn clean si cancella la cartella target. Aggiungere in locale la mia webapp come tu stesso dici non ha proprio senso.
    I test sul DBMS per me che sono alle prime armi serve, credimi! Mi sopravvaluti! Sapere che una query funzioni al 100% e che il problema sia altrove per un ignorantello come me può essere utilissimo.
    I test li faccio in locale, posso cancellare le tabelle dopo aver lanciato la classe di test. Sono d’accordo con te che sarebbe meglio cancellare le tabelle prima di eseguire i test e lanciare i file schema.sql e data.sql prima e dopo il test ma non l’ho fatto non perché non ne avessi voglia ma semplicemente perché non saprei come fare. Se hai suggerimenti sono felicissimo di ascoltarti.
  • Re: Validare un form con o senza dipendenza. L'obiettivo è avere una WebApp che non richieda interventi nel breve periodo.

    iBaffiPro ha scritto:


    Ti allego il file .log. E’ un documento grandissimo.
    https://uploadfiles.net/cry/log-file.lo
    Innanzitutto c'è tantissimo log perché evidentemente hai "abbassato" il livello di log a TRACE (non è così per default), che specialmente per Spring fa loggare un sacco di roba ...
    Come hai configurato il logging?

    Comunque gli errori li puoi vedere anche tu. Sono praticamente tutti errori del tipo:

    org.postgresql.util.PSQLException: ERRORE: la relazione "utenti" esiste già
    org.postgresql.util.PSQLException: ERRORE: la relazione "ruoli" esiste già
    org.postgresql.util.PSQLException: ERRORE: un valore chiave duplicato viola il vincolo univoco "utenti_uk"
    ecc... ecc...

    e sono TUTTI legati a quei script di setup schema.sql e data.sql. Questi script, per come sono scritti ora, non risultano particolarmente validi e pertanto andrebbero rivisti bene. Banalmente es. hai fatto delle DROP TABLE prima di fare le CREATE TABLE ?? Direi di no .....

    iBaffiPro ha scritto:


    Tutto chiaro ma credo che install oltre a copiare il .war dentro il recository locale lo crei anche dentro la cartella del progetto. Forse esiste qualcosa di analogo ad install che crea il war solo dentro la cartella del progetto.
    Sì: mvn package

    Deduco che non hai letto la pagina di Maven che avevo linkato. Ci sono 3 "cicli di vita" predefiniti in Maven. Per ciascuna ci sono N fasi. Quello che tu puoi specificare al mvn, oltre alle opzioni (es. -X) sono principalmente due cose: fasi oppure "goal".
    Le fasi sono di base fisse e predeterminate. Se passi "clean", questa fase fa parte del ciclo di vita Clean (sì si chiamano allo stesso modo ma sono due concetti diversi). Se passi "package", questa fase fa parte del ciclo di vita Default.

    Quando specifichi una fase, Maven esegue tutte le fasi dalla prima fino a quella specificata, quindi es.
    validate -> initialize -> generate-sources -> ........ -> prepare-package -> package

    Package è la fase che genera il pacchetto (jar/war/ecc..) e lo mette SOLO sotto la target/

    La fase di install è ben dopo, quindi se chiedi instal, fa anche la fase di package più altro prima di fare il install.

    In alternativa, si può passare al mvn un "goal" che è specifico di un plugin. Ad esempio puoi lanciare (prova sul tuo progetto!):

    mvn dependency:tree

    Questo goal dependency:tree è gestito direttamente dal Maven Dependency Plugin e fa stampare l'albero di tutte le dipendenze fatto in ASCIIart, cioè con le lineette, trattini ecc...

    iBaffiPro ha scritto:


    Conviene far fare tutto all’IDE e se ci sono problemi invece di usare mvn clean si cancella la cartella target.
    Sì però a volte è più utile e/o comodo lanciare mvn da prompt comandi.

    iBaffiPro ha scritto:


    I test sul DBMS per me che sono alle prime armi serve, credimi! Mi sopravvaluti! Sapere che una query funzioni al 100% e che il problema sia altrove per un ignorantello come me può essere utilissimo.
    I test li faccio in locale, posso cancellare le tabelle dopo aver lanciato la classe di test. Sono d’accordo con te che sarebbe meglio cancellare le tabelle prima di eseguire i test e lanciare i file schema.sql e data.sql prima e dopo il test ma non l’ho fatto non perché non ne avessi voglia ma semplicemente perché non saprei come fare. Se hai suggerimenti sono felicissimo di ascoltarti.
    La questione è più complessa di quanto credi. Innanzitutto JUnit NON esegue i test @Test nell'ordine in cui tu li hai scritti. L'ordine è più vago e dipende da come la reflection di Java tira sù i metodi a runtime dalla classe.
    Quindi non sai a priori in che ordine vengono fatti i singoli test. Essendoci una base dati "persistente" tra un test e l'altro il rischio (molto alto) è che i test diventino "interdipendenti" tra di loro, ovvero il risultato del test successivo abbia successo o no in base a cosa il test precedente ha fatto o come ha lasciato la base dati.
    Prima di ogni singolo test @Test bisognerebbe fare una fase di setup in cui si prepara la base dati mettendo o togliendo dati opportunamente. E ovviamente a questo livello NON puoi farlo "a mano". Ci sono anche librerie/strumenti Java che facilitano setup del genere.
    Insomma, hai capito che fare test direttamente su una base dati reale (e persistente) è critico e va fatto in modo ragionato e appropriato.
  • Re: Validare un form con o senza dipendenza. L'obiettivo è avere una WebApp che non richieda interventi nel breve periodo.

    C'è differenza tra "mvn package > log-file.log" e "mvn package", il primo funziona sempre, il secondo solo a volte. Se metto "logging.level.org.springframework=INFO" entrambi producono target se metto "logging.level.org.springframework=TRACE" solo il primo (mvn package > log-file.log) produce target mentre il secondo va in errore:
    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test (default-test) on project script: There are test failures.

    Non ho messo DROP TABLE nei file .sql perché se per qualche strana ragione il server su cui si trova l'applicazione si spegne, appena la WebApp riparte il DBMS reale viene interamente cancellato. Sarei interessato a fare un DROP TABLE solo in fase di sviluppo ma non so come fare. Sarebbe bello che Postgresql potesse, in sviluppo, funzionare come H2, ma non so come fare. Usando JdbcTemplate, il DBMS H2 non lo posso usare, la sintassi di H2 sarà sicuramente diversa dalla sintassi Postgresql.

    Sul fatto che i test non avvenissero secondo il mio ordine ne ero cosciente infatti ogni test riporta il database allo stato iniziale. Non metto in dubbio che la classe test possa essere migliorata ma al momento non mi va di preoccuparmene in quanto desidero terminare il modulo di registrazione. Ci ritornerò sicuramente. Ti ringrazio molto per il consiglio. Ci sono tante "belle cose" ma poca documentazione chiara che spiega rapidamente come fare le cose, bisogna accontentarsi.
  • Re: Validare un form con o senza dipendenza. L'obiettivo è avere una WebApp che non richieda interventi nel breve periodo.

    iBaffiPro ha scritto:


    C'è differenza tra "mvn package > log-file.log" e "mvn package"
    No, NON c'è differenza nella funzionalità in Maven. Differisce solo su DOVE va a finire lo standard-output, se su una console (se lo lanci da console) o su un file.

    iBaffiPro ha scritto:


    il primo funziona sempre, il secondo solo a volte. Se metto "logging.level.org.springframework=INFO" entrambi producono target se metto "logging.level.org.springframework=TRACE" solo il primo (mvn package > log-file.log) produce target mentre il secondo va in errore:
    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test (default-test) on project script: There are test failures.
    Il failure di un test non c'entra con il livello di logging.

    iBaffiPro ha scritto:


    Non ho messo DROP TABLE nei file .sql perché se per qualche strana ragione il server su cui si trova l'applicazione si spegne, appena la WebApp riparte il DBMS reale viene interamente cancellato. Sarei interessato a fare un DROP TABLE solo in fase di sviluppo ma non so come fare.
    Script eseguiti all'avvio come quei schema.sql e data.sql non si dovrebbero mai usare in un ambiente di "produzione" (azzardatissimo!!).
    Al massimo in un ambiente di sviluppo o test.

    Basterebbe usare i profili di Spring, avere es. application-dev.properties e application-prod.properties e poi avviare specificando il tal profilo.

    iBaffiPro ha scritto:


    Sarebbe bello che Postgresql potesse, in sviluppo, funzionare come H2, ma non so come fare.
    Di per sé no, PostgreSQL non è nato per essere un db "embedded" come H2.

    iBaffiPro ha scritto:


    Usando JdbcTemplate, il DBMS H2 non lo posso usare, la sintassi di H2 sarà sicuramente diversa dalla sintassi Postgresql.
    Certo che si può usare H2 se usi JdbcTemplate. Chiaramente, dovendo scrivere delle query direttamente in SQL, i problemi legati a sintassi differenti o concetti differenti tra i db è ben possibile che ci siano. Ci sono varie soluzioni.
    Volendo mantenere l'uso del JdbcTemplate, se ci dovessero essere molte differenze, una soluzione è object-oriented: una interfaccia che descrive il repository/dao e poi N implementazioni.

    Es. interfaccia RuoloRepository poi implementazioni H2RuoloRepository, PostgresqlRuoloRepository. E sfruttando configuration, profili o altre feature di Spring si fa "tirare su" come bean l'una o l'altra implementazione.
  • Re: Validare un form con o senza dipendenza. L'obiettivo è avere una WebApp che non richieda interventi nel breve periodo.

    Dovrei usare i profili per gestire i 2 DBMS, quello in locale e quello sul server (se mai ne avrò uno...), questo sicuramente.
    L'idea di usare H2RuoloRepository, PostgresqlRuoloRepository è bella ma se sul server ho PostgreSQL non mi accontento di usare H2 in locale per testare la webapp. Comunque avere la possibilità di far funzionare l'applicazione anche su H2 ha indubbiamente i suoi vantaggi.
    Mi appunto tutti i tuoi consigli e ti ringrazio moltissimo.
    Profili certamente ed H2 pure.

    La cosa che non capisco e cosa cambieresti della mia webapp. Gli script che ho trovato in rete sono tutti come il mio ovvero si delega alla webapp l'onere di creare lo schema del DBMS. E' scomodo creare schema.sql e data.sql dal pannello di controllo di Postgresql.

    Grazie per gli spunti
  • Re: Validare un form con o senza dipendenza. L'obiettivo è avere una WebApp che non richieda interventi nel breve periodo.

    iBaffiPro ha scritto:


    L'idea di usare H2RuoloRepository, PostgresqlRuoloRepository è bella
    Altra alternativa, usare librerie come MyBatis dove le query SQL sono esternalizzate in file .xml. Oppure ... passare a JPA ...

    iBaffiPro ha scritto:


    ma se sul server ho PostgreSQL non mi accontento di usare H2 in locale per testare la webapp.
    Nessuno vieta di farsi un ambiente es. "preprod" che usa PostgreSQL ma che ovviamente sarebbe ben differente da quello di produzione.

    iBaffiPro ha scritto:


    Gli script che ho trovato in rete sono tutti come il mio ovvero si delega alla webapp l'onere di creare lo schema del DBMS.
    Perché è uno scenario "semplicistico", che va benissimo a scopo introduttivo o per le finalità di un articolo o un libro. Ma la realtà è spesso ben diversa. Specialmente nelle aziende, dove è facile/tipico che ci siano molti ambienti, es. "dev", "beta", "qa", "preprod" .. "prod". In questi contesti NON si usano degli script "totalitari" come quelli che hai usato, che creano tutto quanto da zero. È invece più comodo usare strumenti come Flyway o Sqitch (e sicuramente altri) che gestiscono le modifiche sul DB in maniera incrementale.
  • Re: Validare un form con o senza dipendenza. L'obiettivo è avere una WebApp che non richieda interventi nel breve periodo.

    Grazie per i preziosissimi consigli.

    Io però non sono un'azienda e non ho tutti quei problemi di dover usare versioni diverse della stessa applicazione.
    Prima di tutto devo vedere se sono in grado di realizzare l'applicazione che ho in mente.
    Se devo aggiornare l'applicazione e quindi il DBMS in effetti avrei qualche difficoltà ma per ora non me ne preoccupo.
    Ragionerò sui tuoi punti in seguito, ad applicazione conclusa (se la concludo...).
Devi accedere o registrarti per scrivere nel forum
13 risposte