Il problema
Il mio programma legge degli input che sono delle espressioni
come ad esempio 3+2*8/(2+2)
e ha bisogno di calcolarne il risultato.
Librerie
Potrei anche lavorare un pochino di tempo e scrivere un bel pezzo di software che valuta qualsiasi espressione ma... è possibile che questo software esista già e abbia una licenza che ci consenta di utilizzarlo! Potrebbe poi anche succedere che il pezzo di software (libreria) che ci serve ha a sua volta bisogno di un'altra (o più!) libreria e così via di seguito. In questo caso potrebbe essere un bel rompicapo gestire il tutto.
Fortunatamente esistono strumenti che fanno questo e moltissimo di più
(sono degli strumenti per gestire i progetti a tutto tondo): noi useremo
Apache che è lo strumento
largamente più utilizzato per questo scopo.
È talmente utilizzato che scaricando una versione "Eclipse IDE for Enterprise Java and Web Developers"
l'integrazione con Maven è già al suo interno. È talmente utilizzato che nel suo archivio principale
si possono trovare 445116 librerie diverse e contando le versioni il numero
si avvicina ad 8 milioni.
Il primo progetto con Maven
Voglio creare un progetto che farò gestire da Maven e il pacchetto è
it.edu.espressioni
,
da Eclipse creo un nuovo progetto "Maven Project" e faccio attenzione ad alcune cose:
- spunto "Create simple project (skip archetype selection)"
- "Group id" è la prima parte del nome del pacchetto, nel nostro esempio "it.edu"
- "Artifact id" è l'ultima parte, "espressioni" nel nostro esempio.
Cosa è stato creato
Nel guardate tutto il materiale dobbiamo tenere presente una cosa: Maven si basa su una serie di convenzioni (una è di tenere i file sorgente organizzati), se le rispettiamo non bisogna indicare nulla, diversamente va modificato il file di configurazione del nostro progetto. Rispetto ad un normale progetto di Eclipse qui ci sono diverse cose in più, ma non sono poi tanto particolari, le descriviamo una per una:
- src/main/java
- Questa è la cartella in cui si trovano tutti i sorgenti del nostro progetto
- src/main/resources
- immagini, fogli di stile e tutto quanto non è una classe java che compone il nostro progetto
- src/test/java
- in un progetto funzionante c'è bisogno di classi di test (di cui qui non ci occuperemo) che dovranno essere inserite qui
- src/test/resources
- tutto ciò che serve per i test e non è una classe java
- JRE System Library
- questa non è una cartella ma la versione di java che stiamo utilizzando nel progetto... purtroppo una vecchissima ma la modificheremo
- src
- questa è la cartella che contiene in realtà classi e altro del nostro progetto cioè quello che troviamo nelle prime quattro voci descritte in questo elenco
- target
- questa è la cartella in cui lavora Maven: ci mette i file compilati e tutto quello che produce come i pacchetti (niente di complicato! sono dei file "war" o "jar" che in pratica contengono il software compilato)
- pom.xml
- questo è il file in cui diamo indicazioni a Maven su come è strutturato il nostro progetto e di cosa ha bisogno.
pom.xml
Fondamentalmente interagire con Maven vuol dire scrivere cose in questo file, quello che genera Eclipse è una cosa del genere:
<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> <groupId>it.edu</groupId> <artifactId>espressioni</artifactId> <version>0.0.1-SNAPSHOT</version> </project>
Tutti i campi dovrebbero essere auto-esplicativi, adesso però vogliamo dire a Maven che il nostro progetto ha bisogno di una libreria in particolare che abbiamo trovato... ovviamente leggendo un articolo su internet quindi aggiungiamo prima del tag di chiusura del progetto:
<dependencies> <dependency> <groupId>com.fathzer</groupId> <artifactId>javaluator</artifactId> <version>3.0.3</version> </dependency> </dependencies>
Quando si salva il file Eclipse aggiorna il progetto ma se questo per qualche motivo non dovesse succedere basta fare click con il destro sul nome del progetto e dal menù contestuale selezionare "Maven/Update project..."
A questo punto nel progetto compare anche una sezione "Maven Dependencies" in cui vengono elencate le librerie gestite da Maven.
Il programma
A questo punto è facilissimo scrivere il programma che ci serve. Creo la nuova classe "it.edu.espressioni.calcolatore.Test" e al suo interno creo il metodo statico main che contiene semplicemente:
String espressione = "3+2*8/(2+2)"; DoubleEvaluator valutatore = new DoubleEvaluator(); double risultato = valutatore.evaluate(espressione); System.out.println(risultato);
Eseguendo il programma cosa succede?
Versioni di java
Abbiamo visto che la versione di Java scelta in automatico alla generazione del progetto non è quella che vorremmo, visto che usiamo Maven la nostra preferenza va indicata nel file pom.xml e in particolare nella sezione build che possiamo mettere prima di chiudere project:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <release>17</release> </configuration> </plugin> </plugins> </build>
Una volta fatta questa modifica e salvato il file va fatta ricaricare la configurazione ad eclipse facendo click con il tasto destro sul file pom.xml e selezionando il menù contestuale "Maven/Update Project...".
Se il file pom.xml viene modificato ma non viene ricaricata la sua configurazione Eclipse segnala un errore nel progetto (un pallino rosso sul nome del progetto).
In caso di proxy
Maven fa accesso alla rete per scaricare il software, se il nostro computer deve usare un proxy dobbiamo indicarlo in uno specifico file di configurazione, questo file se usiamo eclipse possiamo chiamarlo come vogliamo e salvarlo dove vogliamo. Soltanto per esempio poniamo di chiamarlo "maven-setting.xml" e di salvarlo sulla scrivania:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"> <proxies> <proxy> <id>proxy-http</id> <active>true</active> <protocol>http</protocol> <host>10.1.1.254</host> <port>3128</port> </proxy> <proxy> <id>proxy-https</id> <active>true</active> <protocol>https</protocol> <host>10.1.1.254</host> <port>3128</port> </proxy> </proxies> </settings>
Ovviamente come host e come porta vanno inseriti quelli della nostra rete.
Una volta salvato il file bisogna indicarlo ad Eclipse:
- aprire le preferenze di Eclipse
- aprire il gruppo "Maven"
- fare click su "User settings"
- fare click sul pulsante "browse" alla destra della casella "User Settings"