Semaine 14: Construction d'un livrable - semiria/INF2015 GitHub Wiki
##Objectifs
- Construire un livrable qui se tient en Java
- Exécuter un projet construit par Maven en ligne de commande
##Exercices## Pour les exercices, vous aurez besoin de télécharger le projet JSON, et pointer vers la branche maven.
Vous remarquerez que même si le projet JSON compile et s'exécute bien à partir de NetBeans, il ne s'exécutera pas bien à la ligne de commande:
Stephanies-MacBook-Air-4:target mimac$ java -jar json-1.0-SNAPSHOT.jar
no main manifest attribute, in json-1.0-SNAPSHOT.jar
Tandis que nous devrions avoir un retour similaire que ce que nous avons présentement à la console:
lundi
mardi
mercredi
jeudi
vendredi
["mardi","samedi","jeudi","vendredi","samedi","dimanche"]
perceval
arthur
lancelot
karadoc
daenarys
sam
jon
["jd","turk","elliot"]
{"personnages":["jd","turk","elliot"]}
[{"personnages":["perceval","arthur","lancelot","karadoc"]},{"personnages":["daenarys","sam","jon"]},{"personnages":["jd","turk","elliot"]}]
###Inclure les dépendances dans la construction du projet### Pour inclure les dépendances (ie. json-lib) lors de la construction du projet, nous devons indiquer à Maven de construire un jar contenance les dépendances.
Pour se faire nous devons modifier le fichier pom.xml et ajouter les informations suivantes:
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
Compiler le projet à partir de NetBeans créera deux jars:
my-app-1.0-SNAPSHOT-jar-with-dependencies.jar
my-app-1.0-SNAPSHOT.jar
Vous remarquerai que les dépendances sont désormais incluses dans l'archive my-app-1.0-SNAPSHOT-jar-with-dependencies.jar
:
my-app-1.0-SNAPSHOT-jar-with-dependencies
├── LICENSE.txt
├── META-INF
├── json
├── junit
├── net
└── org
###Spécifier la fonction main### Nous devons spécifier à Maven quelle fonction main utiliser dans le jar qu'il va construire, c'est-à-dire que le fichier my-app-1.0-SNAPSHOT-jar-with-dependencies.jar sait quelle fonction main appeler.
<configuration>
...
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>json.JSON</mainClass>
</manifest>
</archive>
</configuration>
###Déplacer les ressources dans le répertoire prévus par Maven###
Maven prévoit un emplacement par défaut pour les fichiers de types ressources. En déplaçant les fichiers du répertoire json
dans le répertoire src/main/resources/
, Maven inclura automatiquement ces fichiers lors de la construction du jar.
src/
├── main
│ ├── java
│ │ └── json
│ │ ├── FileReader.java
│ │ └── JSON.java
│ └── resources
│ └── json
│ ├── jours.json
│ ├── oeuvres.json
│ └── personnages.json
└── test
└── java
Les ressources sont désormais incluses dans l'archive au même niveau que les fichiers .class dans l'archive my-app-1.0-SNAPSHOT-jar-with-dependencies.jar
:
my-app-1.0-SNAPSHOT-jar-with-dependencies/json/
├── FileReader.class
├── JSON.class
├── jours.json
├── oeuvres.json
└── personnages.json
###Charger les ressources de façon dynamique###
Les ressources sont à des endroits différents entre l'exécution à partir de NetBeans et l'exécution à la ligne de commande. Nous devons modifier le chargement des ressources afin d'utiliser la méthode getResourceAsStream
, qui elle se chargera d'obtenir les ressources à partir du même chemin d'accès.
Nous devrons remplacer cette ligne:
String json = FileReader.loadFileIntoString("json/jours.json", "UTF-8");
Par:
InputStream fluxFichier = JSON.class.getResourceAsStream("/json/jours.json");
String json = IOUtils.toString(fluxFichier, "UTF-8");
Ajuster les import
en conséquences et faire une manipulation similaire pour la ligne:
String jsonPersonnages = FileReader.loadFileIntoString("json/personnages.json", "UTF-8");
La classe FileReader.java
deviendra automatiquement obsolète et pourra être effacée des fichiers.
###Exécuter le projet via la ligne de commande### Exécuter le projet à la ligne de commande donne désormais le même résultat que l'exécution à partir de NetBeans:
java -jar my-app-1.0-SNAPSHOT-jar-with-dependencies.jar
Stephanies-MacBook-Air-4:target mimac$ java -jar my-app-1.0-SNAPSHOT-jar-with-dependencies.jar
lundi
mardi
mercredi
jeudi
vendredi
["mardi","samedi","jeudi","vendredi","samedi","dimanche"]
perceval
arthur
lancelot
karadoc
daenarys
sam
jon
["jd","turk","elliot"]
{"personnages":["jd","turk","elliot"]}
[{"personnages":["perceval","arthur","lancelot","karadoc"]},{"personnages":["daenarys","sam","jon"]},{"personnages":["jd","turk","elliot"]}]
##Solutionnaire## La branche contruction-livrable du projet JSON.