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.

⚠️ **GitHub.com Fallback** ⚠️