Slick2d, leçon 8 :: Packager l'application

02 March 2014 09:12 Slick2d - Leçons 0-9 Java, Maven, Slick2d, Tutorial

Devant le nombre commentaire à ce  sujet je me sens obligé de vous donner une astuce pour réussir à distribuer votre jeu sous forme d'une archive qu'il suffira de décompresser. Ici j'utiliserai des taches maven, mais il est tout à fait possible de s'en sortir avec un script ant.

Le problème : les natives et les ressources

Comme je l'ai expliqué dans la première leçon, Slick2D utilise OpenGL via LWJGL. LWJGL est un binding OpenGL en Java, cela signifie que chaque appel à une méthode OpenGL est convertie en un appel à une bibliothèque native, c'est à dire les fichiers *.dll sous windows, *.so sous linux  et *.jnilib sous mac).

Le soucis c'est qu'il faut indiquer à la machine virtuel Java ou se trouve ces natives ! Sous Linux c'est pas un soucis, c'est le système qui gère si LWJGL est installer sur le système. Pour les autres et dans le cas ou LWJGL n'est pas installé, il faut l'indiquer lors du lancement de la JVM à l'aide de l'option -Djava.library.path=dossier-des-natives. Pour cela on pourra se servir par exemple d'un script de lancement (.bat ou .sh) ou d'un autre programme java pour le lancer.

Un autre problème que l'on rencontre est le chargement des ressources, c'est à dire les image, les cartes, la musique, etc... En effet autant parfois slick arrive tout à fait à lire les ressources qui sont contenu dans un jar autant pour certaine ressource comme une carte il ne peu pas.

Packaging de l'application

Idée est donc de faire une archive (zip ou tar.gz) dans laquelle on va embarquer l'intégralité de l'application, les jar, les ressources et les natives et les scripts. L'utilisateur n'aura plus qu'à décompresser l'archive pour exécuter le jeu. L'archive sera organisé comme suit :

  • /lib : les jars venant des dépendance (slick, lwjgl etc...)
  • /natives : les dll, so, etc..
  • /map : les cartes
  • /sound : les musiques
  • /sprites : les sprites...
  • /SlickBlockTutorial.jar : c'est le jar exécutable de mon exemple.
  • /start.bat : script de lancement pour windows
  • /start.sh : script pour linux

Pour cela on va s'y prendre en plusieurs étape.

Préparation du jar exécutable

Pour la première étape nous allons créer un jar avec un manifest embarqué pour y indiquer la main class et les libs nécessaire à l'application. Pour cela il faut ajouter ce plugin aux builds :

<strong><plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <configuration>
    <!-- nom du fichier jar -->
    <finalName>SlickBlogTutorial</finalName>
    <archive>
      <manifest>
        <!-- classe contenant le main -->
        <mainClass>lesson7.MusicGame</mainClass>
        <!-- ajouter les dépendances préfixées de /lib -->
        <addClasspath>true</addClasspath>
        <classpathPrefix>lib/</classpathPrefix>        
      </manifest>
    </archive>
    <!-- n'inclure que le code compilé -->
    <includes>
      <include>**/*.class</include>
    </includes>
  </configuration>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>jar</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Création des scripts de lancement.

Sous linux ou sous windows, il suffit de créer un fichier start.sh ou start.bat que l'on va mettre dans src/main/resources. Dans ce fichier on ferra simplement le lancement de l'application comme suit :

java -Djava.library.path=natives -jar SlickBlogTutorial.jar

Extraire les natives

Avant de préparer le packaging de l'application il faut extraire les natives des fichiers jar les contenant. Pour cela il faut ajouter ce plugin au build comme dans la première leçon.

<plugin>
  <groupId>com.googlecode.mavennatives</groupId>
  <artifactId>maven-nativedependencies-plugin</artifactId>
  <version>0.0.7</version>
  <executions>
    <execution>
      <id>unpacknatives</id>
      <goals>
        <goal>copy</goal>
      </goals>
      <configuration>
        <nativesTargetDir>target/natives</nativesTargetDir>
        <separateDirs>false</separateDirs>
      </configuration>
    </execution>
  </executions>
</plugin>

Créer l'archive de distribution.

Il ne reste plus qu'a créer une archive l'application pour cela on va utiliser le plugin "maven-assembly-plugin". C'est un plugin qui nécessite de créer un premier fichier distribution.xml que l'on place à la racine du projet. Dans ce fichier on liste ce qu'on souhaite inclure comme fichier dans notre archive.

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
  <id>distribution</id>
  <formats>
    <!-- format de l'archive -->
    <format>tar.gz</format>
  </formats>
  <!-- fichier racine de l'archive généré -->
  <baseDirectory>/</baseDirectory>
  <fileSets>
    <!-- inclusion du jar exécutable généré précédemment -->
    <fileSet>
      <directory>target</directory>
      <outputDirectory>/</outputDirectory>
      <includes>
        <include>*.jar</include>
      </includes>
    </fileSet>
    <!-- ajout des natives décompressées précédemment -->
    <fileSet>
      <directory>target/natives</directory>
      <outputDirectory>natives</outputDirectory>
      <includes>
        <include>*</include>
      </includes>
    </fileSet>
    <!-- ajout des ressources et des scripts -->    
    <fileSet>
      <directory>src/main/resources</directory>
      <outputDirectory>/</outputDirectory>
      <includes>
        <include>**/*</include>
      </includes>
    </fileSet>
  </fileSets>
  <!-- ajout dépendance à l'exclusion des natives et de lui-même -->
  <dependencySets>
    <dependencySet>
      <outputDirectory>/lib</outputDirectory>
      <excludes>
        <exclude>org.lwjgl.lwjgl:lwjgl-platform</exclude>
        <exclude>net.java.jinput:jinput-platform</exclude>
        <exclude>shionn.tuto:SlickBlogTutorial</exclude>
      </excludes>
    </dependencySet>
  </dependencySets>
</assembly></pre>
Enfin il nous reste plus qu’à ajouter le dernier build pour généré la dite archive.
<pre class="xml"><plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.4</version>
    <configuration>
      <descriptors>
        <descriptor>distribution.xml</descriptor>
      </descriptors>
    <appendAssemblyId>false</appendAssemblyId>
  </configuration>
</plugin>

Il ne reste plus qu’à faire un "mvn assembly:assembly" dans une console à la racine du projet et d'attendre que maven travail pour nous.

Resultat Packaging Resultat Packaging Resultat Packaging

Ressources

Tous d’abord je tiens à remercier un collègue pour m'avoir orienté sur le plugin maven-assembly-plugin, il se connaîtra.

par Shionn, dernière modification le 09 April 2017 15:27
4 réflexions au sujet de « Slick2d, leçon 8 :: Packager l'application »
  • dotista 22 February 2015 21:47

    Bonjour, J'ai utilisé un soft qui fait tout ce travail à notre place. JarSplice, en as tu entendu parlé? http://ninjacave.com/jarsplice Les instructions sont simples. ++

  • Shionn 23 February 2015 10:12

    Ce genre d'outil c'est bien beau, mais est-ce que cela fonctionne toujours par rapport au chargement des ressources ? Comme je te l'ai dis par mail, certaine ressource de slick ne peuvent pas être chargé depuis un jar.

    Et puis c'est toujours plus sympas d'apprendre à le faire soit même.

  • Willow 24 February 2016 12:36

    Bonjour,

    J'ai commencé a créer un jeu à partir de vos tutoriels et j'aimerai l'exporter. Mais je n'ai jamais touché à maven et je ne trouve pas comment ajouter un plugin aux builds ni meme comment le créer. est ce que c'est un fichier xml ?

  • Shionn 25 February 2016 09:22

    Je suis désolé mais je n'est pas du tous l'ambition de faire des tutos sur le cycle de vie et le fonctionnement de maven ni sur l'intégration au IDE de développement. Cet article part du principe que la personne connais au moins les bases de maven (comme pour le premier tuto)

    Du coup je t'invite soit à chercher un tuto sur maven, ceux-ci par exemple :

    • http://dcabasson.developpez.com/articles/java/maven/presentation-maven2/
    • http://dcabasson.developpez.com/articles/java/maven/introduction-maven2/

    Si tu es toujours à l’université ou autre, ton prof devrait pouvoir t'en apprendre plus, Aujourd'hui je pense qu'il est impensable qu'une formation ne vous présente pas maven, ou graddle ou à minima ant.

Laissez un commentaire

Vous pouvez utilisez du markdown pour la mise en forme

Votre adresse de messagerie ne sera pas publiée.

Temporairement, pour lutter contre les bots, il n'est pas permis de mettre http:// dans le commentaire.