Configurer l'espace de travail de Forge pour Kotlin



  • Sommaire

    Introduction

    Ce tutoriel vous proposer d'adapter votre environnement de travail pour utiliser le langage de programmation Kotlin dans vos Mod Minecraft.

    Pré-requis

    Compilateur Kotlin

    Afin d'utiliser le langage de programmation Kotlin, vous devez utiliser un environnement de programmation adapté.

    Hello Kotlin

    Avant de vous lancer dans la programmation de Mod, je vous conseille de vérifier qu'un programme simple en Kotlin se compile et lance bien depuis votre environnement.

    Avec IntelliJ IDEA 2016.1, voici les étapes à suivre. Tout d'abord créer un nouveau projet Java avec support Kotlin.

    Dans ce nouveau projet, donner les informations concernant l'environnement Java et le compilateur Kotlin utilisé. Il est possible que le « Project SDK » soit vide si vous créez un projet pour la première fois. Sélectionnez « New… », puis « JDK » et pointez vers le répertoire contenant une installation du Java Developement Kit sur votre ordinateur.

    Cochez l'option « Kotlin (Java) ».

    Si « Use library: » est vide, appuyez sur « Create... », sélectionnez « Copy to: » et laissez le reste par défaut. Confirmez avec Ok.

    Puis confirmez cette page de configuration avec « Next »

    Sur la page suivante, entrez le « Project name » et le « Project location », respectivement le nom de votre projet et son emplacement sur votre ordinateur.

    Confirmez la création du projet avec « Finish »

    Depuis la vue principale de l’environnement, créez un nouveau fichier dans le répertoire « src » en cliquant droit sur « src », et sélectionnant « New » puis « Kotlin File/Class ».

    J'appelle mon fichier PremierTest, et je précise que c'est un fichier libre, et non un template de classe.

    Un fichier PremierTest.kt est à présent présent dans le répertoire « src ». Ajoutez-y le code suivant.

    fun main(args: Array<string>) {
       println("Hello Kotlin!")
    }
    

    Compilez le projet.

    Puis définissez une cible de lancement en appuyant sur la petite flêche vers le bas à côté de la compilation. Puis « Edit Configurations ». Avec la croix verte, ajoutez une nouvelle configuration de type « Kotlin », que vous nommerez comme vous le voulez (je la nomme Launch dans l'écran suivant).

    La classe principale (« Main class ») est dans mon cas PremierTestKt. Cette classe est générée automatiquement par le compilateur Kotlin en se basant sur le nom du fichier. Puisque mon fichier se nomme PremierTest.kt, la classe générée se nomme PremierTestKt.

    Validez avec Ok.

    L'icône de lancement (flèche vers la droite est à présent disponible). Appuyez dessus, attendez un moment la fin de la compilation, et si tout s'est bien passé, admirez la sortie dans le terminal :

    Vous avez une chaîne de compilation Kotlin qui fonctionne.

    Ajouter le support Kotlin à Gradle

    Il est temps à présent d'intégrer le support de Kotlin au kot de développement Forge.

    Le début de l'installation de l'environnement suit la même procédure que le tutoriel Installer et configurer l'espace de travail de Forge jusqu'au moment où il est indiqué :

    gradlew -Dorg.gradle.jvmargs=-Xmx2048M setupDecompWorkspace
    

    Ne le faites pas tout de suite !

    Modifions d'abord le fichier build.gradle afin de lui ajouter un support Kotlin pour le développement. On ajoute tout d'abord une dépendance à Kotlin, en précisant le version utilisée. En effet, Kotlin est un langage accompagné d'un environnement qui étend et adapte l'environnement Java.

    buildscript {
    
        […]
    
        ext.kotlin_version = '1.0.2'
    
        dependencies {
            classpath 'net.minecraftforge.gradle:ForgeGradle:2.1-SNAPSHOT'
            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        }
    }
    

    Kotlin nécessite aussi l'utilisation d'un plugin

    apply plugin: 'kotlin'
    apply plugin: 'net.minecraftforge.gradle.forge'
    

    Ensuite, reprenez les opérations habituelles avec:

    gradlew -Dorg.gradle.jvmargs=-Xmx2048M setupDecompWorkspace
    

    Puis, si vous utilisez Eclipse:

    gradlew eclipse
    

    ou bien, si vous utilisez IntelliJ IDEA:

    gradlew idea
    

    Ceci est suffisant pour ajouter du Kotlin à votre projet, le tester, mais pas pour le construire et le distribuer correctement. En effet, si vous publiez dans votre Mod l'environnement Kotlin, il pourra entrer en conflit avec d'autres mods utilisant Kotlin. Nous verrons ça dans un autre tutoriel. En attendant, il vous est possible de tester votre mod localement.

    Ce n'est pas non plus suffisant pour construire un Mod entièrement avec Kotlin, nous avons besoin d'avoir la classe principale en Java. Nous verrons comment faire du 100% Kotlin dans un autre tutoriel.

    Fichier Gradle complet sur GitHub.

    Vérification

    Afin de vérifier que la chaîne de compilation Kotlin fonctionne et est intégrée à votre Mod, nous allons ajouter un fichier en Kotlin qui contiendra une classe. Nous allons construire une instance de cette classe avec un Logger en paramètre, puis appeler une méthode qui affichera l'Id et la version du Mod dans le logger.

    Tout d'abord, je crée une classe de base d'un module, comme indiqué dans Créer la base de son mod (lecture optionnelle). Pour cela, je lance mon environnement de programmation (IntelliJ IDEA) et j'ouvre le projet qui a été crée à l'étape précédente grâce à Gradle.

    J'utilise les outils de renommages pour changer le nom du package et de la classe de base avec de les faire correspondre à mon Mod et j'ajoute la récupération de l'instance de Logger dans la méthode preInit().

    Cela donne le code de base suivant.

    package org.puupuu.kotlinbasedmod;
    
    import net.minecraftforge.fml.common.Mod;
    import net.minecraftforge.fml.common.Mod.EventHandler;
    import net.minecraftforge.fml.common.event.FMLInitializationEvent;
    import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
    import org.apache.logging.log4j.Logger;
    
    @Mod(modid = KotlinBasedMod.MODID, version = KotlinBasedMod.VERSION)
    public class KotlinBasedMod
    {
       static final String MODID = "kotlinbasedmod";
       static final String VERSION = "0.1";
    
       private static Logger logger;
    
       @EventHandler
       public void preInit(FMLPreInitializationEvent event) {
           logger = event.getModLog();
       }
    
       @EventHandler
       public void init(FMLInitializationEvent event)
       {
       }
    }
    

    Commit du fichier sur GitHub.

    Ensuite, dans le même package, j'ajoute un fichier Kotlin, cette fois en précisant que c'est un fichier de Classe, que je nomme TestKotlin.

    Au moment de l'ajout du premier fichier Kotlin, IntelliJ IDEA demandera de configurer l'environnement pour Kotlin. En effet, si dans le test de la section précédente, nous avions créé un projet Kotlin, ici, ForgeGradle nous a préparé un environnement Java. Il suffit de renseigner dans la configuration les mêmes éléments que précédemment.

    L'éditeur génère quelque chose qui ressemble à ceci :

    package org.puupuu.kotlinbasedmod
    
    class TestKotlin {
    }
    

    Je modifie ce fichier avec le code suivant, que je vais commenter juste après.

    package org.puupuu.kotlinbasedmod
    
    import org.apache.logging.log4j.Logger
    
    class TestKotlin(val logger: Logger) {
       fun go() {
           logger.info("I'm module ${KotlinBasedMod.MODID} at version ${KotlinBasedMod.VERSION}.");
       }
    }
    

    Fichier sur GitHub

    • Les deux premières lignes ressemblent fortement à leurs équivalent Java. Tout d'abord la déclaration du package dont le fichier fait parti, puis l'import de la classe Logger, qui est utilisée par la suite.
    • Une différence notable cependant : il n'y a pas de point-virgules à la fin des instructions.
    • Le mot-clé class indique, comme en Java, la définition d'une classe. Il n'est pas nécessaire de préciser qu'elle est publique.
    • TestKotlin est le nom de la classe, suivi entre parenthèses par les paramètres du constructeur principal (et unique, dans cet exemple). logger est le nom de la variable, Logger, après les deux points, son type. L'instruction val qui précède indique que ce paramètre initialise un membre de cette classe.
    • Le mot-clé fun indique la définition d'une fonction, une fonction membre dans notre cas, mais Kotlin permet aussi la création de fonction libres, c'est-à-dire hors d'une classe. La fonction ici est nommée go et ne prend pas de paramètre.
    • Le corps de la fonction appelle la fonction debug du membre logger (défini par le constructeur) avec en paramètre une chaîne de caractères.
    • L'appel a la fonction est rigoureusement identique à son équivalent Java.
    • La chaîne de caractères est construite en remplaçant les expressions à l'intérieur des ${…}.

    Nous voyons donc que côté Kotlin, nous pouvons manipuler des types et des objets Java.

    Côté Java à présent, il nous faut créer une instance de la classe TestKotlin et appeler la fonction go().

    Faisons ça dans la fonction init() de la classe principale.

    @EventHandler
    public void init(FMLInitializationEvent event)
    {
       TestKotlin test = new TestKotlin(logger);
       test.go();
    }
    

    Fichier complet sur GitHub.

    Côté Java, nous pouvons donc accéder de manière transparente au monde Kotlin.

    Résultat

    Il est maintenant temps de lancer le client Minecraft et d'admirer la sortie du log.

    (…)
    [22:18:37] [Client thread/INFO]: Max texture size: 16384
    [22:18:37] [Client thread/INFO]: Created: 16x16 textures-atlas
    [22:18:38] [Client thread/INFO]: I'm module kotlinbasedmod at version 0.1.
    [22:18:38] [Client thread/INFO]: Injecting itemstacks
    [22:18:38] [Client thread/INFO]: Itemstack injection complete
    (…)

    Crédits

    Rédaction :

    • Mokona78

    Correction :


    Ce tutoriel de Minecraft Forge France est mis à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International

    Retour vers le sommaire des tutoriels


  • Rédacteurs

    J'ai survolé mais ça m'a l'air intéressant à partir du moment où on veut utiliser Kotlin, tu pourrai spécifier l'utilité d'utiliser Kotlin plus que Java, à moins que ce soit vraiment parce qu'on aurait envie.


  • Administrateurs

    Je regarderai plus en détail demain, mais en tout cas, c'est une bonne idée de faire une démonstration d'un autre langage pour le modding Forge.

    Envoyé de mon Nexus 4 en utilisant Tapatalk



  • J'ai enlevé la partie sur la vidéo. Je pense en faire une, mais pas tout de suite.

    L'intérêt d'utiliser Kotlin sera traité sur des exemples dans les prochains tutoriels. En fait, je voulais écrire un tutoriel sur « comment fait-on en Kotlin ». En l'écrivant, je me suis dit qu'il était préférable d'aider tout d'abord à installer un environnement, pour ceux qui seraient tentés.



  • @'Mokona78':

    J'ai enlevé la partie sur la vidéo. Je pense en faire une, mais pas tout de suite.

    L'intérêt d'utiliser Kotlin sera traité sur des exemples dans les prochains tutoriels. En fait, je voulais écrire un tutoriel sur « comment fait-on en Kotlin ». En l'écrivant, je me suis dit qu'il était préférable d'aider tout d'abord à installer un environnement, pour ceux qui seraient tentés.

    Personnellement je ne suis pas pour installer un nouveau langage qui fait la même chose (voir peut être même moins) qu'un mod fait un java pur et dur et qui va en plus consommer de la mémoire inutilement, ça pourrait être utile seulement si des personnes veulent créer des mods en dehors des jars (par exemple des petits scripts).



  • Chacun choisi le langage dans lequel il veut programmer bien entendu. Mes posts sont là pour présenter une alternative afin de pouvoir faire le (son propre) bon choix.

    Quelques précisions qui me semblent nécessaires du coup :

    • installer un nouveau langage : on installe un compilateur et un plugin au niveau de l'environnement.
    • fait la même chose (voir peut être même moins) : Kotlin a été crée pour être plus expressif et plus solide  que Java en moins verbeux, en ce sens, il en fait plus.
    • qui va en plus consommer de la mémoire inutilement : cela coûte effectivement ~750Ko d'un .jar supplémentaire, c'est donc ce poids en plus dans le Mod. J'ai cru voir un Mod qui distribue Kotlin en tant que Mod, ce qui permettrait de mutualiser ces 750ko entre les différents Mod qui utilisent Kotlin (au prix d'une dépendance).
    • ça pourrait être utile seulement si des personnes veulent créer des mods en dehors des jars : Kotlin est un langage qui produit des .class, qui sont packagées dans des .jar. Ce n'est pas vraiment un langage adapté à des petits scripts rapides (mais je ne comprends pas bien cette histoire de « petits scripts en dehors des jars »)


  • @'Mokona78':

    Chacun choisi le langage dans lequel il veut programmer bien entendu. Mes posts sont là pour présenter une alternative afin de pouvoir faire le (son propre) bon choix.

    Quelques précisions qui me semblent nécessaires du coup :

    • installer un nouveau langage : on installe un compilateur et un plugin au niveau de l'environnement.
    • fait la même chose (voir peut être même moins) : Kotlin a été crée pour être plus expressif et plus solide  que Java en moins verbeux, en ce sens, il en fait plus.
    • qui va en plus consommer de la mémoire inutilement : cela coûte effectivement ~750Ko d'un .jar supplémentaire, c'est donc ce poids en plus dans le Mod. J'ai cru voir un Mod qui distribue Kotlin en tant que Mod, ce qui permettrait de mutualiser ces 750ko entre les différents Mod qui utilisent Kotlin (au prix d'une dépendance).
    • ça pourrait être utile seulement si des personnes veulent créer des mods en dehors des jars : Kotlin est un langage qui produit des .class, qui sont packagées dans des .jar. Ce n'est pas vraiment un langage adapté à des petits scripts rapides (mais je ne comprends pas bien cette histoire de « petits scripts en dehors des jars »)
    • Oui c'est comme le scala
    • Je parle au niveau des possibilités (je sais pas si tout ce qui est possible en java est possible en Kotlin). Je suis d'accord que certains peuvent préférer la syntaxe du Kotlin plutôt que le java
    • Je parle de la mémoire RAM surtout
    • Je pensais à quelque chose comme les nouveaux mods pour la version windows 10 de minecraft qui eux sont fait en javascript


  • @'SCAREX':

    • Oui c'est comme le scala
    • Je parle au niveau des possibilités (je sais pas si tout ce qui est possible en java est possible en Kotlin). Je suis d'accord que certains peuvent préférer la syntaxe du Kotlin plutôt que le java
    • Je parle de la mémoire RAM surtout
    • Je pensais à quelque chose comme les nouveaux mods pour la version windows 10 de minecraft qui eux sont fait en javascript
    • C'est comme pour Scala, en effet.
    • Tout ce qui est faisable en Java l'est en Kotlin, et inversement.
    • À part le runtime de Kotlin (le jar de ~750ko), rien d'autre. Le modèle mémoire est rigoureusement le même.
    • Kotlin produit du code pour JVM, et pas du tout pour une machine virtuelle Javascript.