Il ressemble à un engrenage bleu clair mais avec une tête de robot au milieu en blanc. Le robot a de gros yeux comme des contours de lunettes épaisses.
Icone Malt de Yann PicotIcone LinkedIn de Yann PicotIcone GitHub de Yann Picot
Ordinateur affichant une page de code floue avec des lunettes posées devant, permettant de voir le code clairement. Photo prise par Kevin Ku.

Projets > Récupérer le code source d'un fichier compilé JAVA

Récupérer un environnement de développement Java à partir de fichiers compilés

05/12/2024 - Auteur : Yann P

Table des matières

  1. Première étape : Décompiler un fichier compilé .jar
  2. Deuxième étape : Organiser les sources
  3. Troisième étape : Compiler les sources du projet
  4. Quatrième étape : Produire un FAT JAR
  5. Liens externes et sujets connexes

Les projets présentés dans la section projets du site sont d'ordre personnel ou professionnel. Ils visent à décrire dans les grandes lignes la méthode utilisée pour résoudre une problématique. Ce ne sont pas des tutoriels détaillés. Toutefois, n'hésitez pas à me contacter par email, via le formulaire de contact ou sur mes réseaux sociaux si vous souhaitez des précisions sur les sujets abordés. Vous pouvez également vérifier s'ils ne figurent pas dans la section documentations.


Le projet provient initialement d'une problématique professionnelle. L'objectif est de comprendre comment décompiler un fichier .jar de type FAT JAR et le rendre à nouveau compilable dans un IDE. Je pars d'un fichier FAT JAR lisible. Il existe de nombreuses techniques pour protéger le code source après sa décompilation, comme l'obfuscation. Cette méthode peut rendre les sources inutilisables ou très difficiles à interpréter. Par exemple : Obfuscation du code source sur freelancerepublik. Dans ce cas, vous pourriez être dans l'impossibilité de récupérer les sources ou rencontrer de grandes difficultés à rendre le code à nouveau compréhensible.

Première étape : Décompiler un fichier compilé .jar

Plusieurs solutions existent pour décompiler des fichiers .jar. Pour ce projet, j'ai utilisé un script nommé Quiltflower En retraçant l'historique de ce projet, j'ai découvert qu'il s'appelle désormais GitHub Vineflower. Ma version s'exécute en ligne de commande, avec des paramètres pour définir le chemin des fichiers à décompiler et celui de destination.
Exemple :


  1. Script quiltflower
  2. Fichier quiltflower-1.9.0.jar affiché dans l'explorateur Windows.
  3. Fichier à décompiler
  4. Fichier test_quiltflower.jar affiché dans l'explorateur Windows.
  5. Exécution de la commande
  6. Journal d'exécution d'une commande : 'java -jar .\quiltflower-1.9.0.jar -dgs=1 ./chemin-origine ./chemin-destination'.
  7. Dossier des fichiers décompilés
  8. Arborescence des fichiers dans l'explorateur Windows.
  9. Librairies décompilées
  10. Bibliothèques affichées au format .java dans un projet.
  11. Sources décompilées
  12. Fichier main.java dans un projet Java.

Deuxième étape : Organiser les sources

Il existe plusieurs types de sources :

  • Les sources provenant de librairies
  • Les fichiers de configuration (variables d'environnement, mots de passe, pom.xml, gradle, etc.)
  • Les sources du projet créées par les développeurs

a. Le fichier manifest.mf

Il faut d'abord rechercher le fichier manifest.mf pour y trouver la main-class et la version du JDK.

  • La main-class correspond au fichier qui sera exécuté en premier lors de l'exécution de la commande
  • La version du JDK permet d'éviter tout problème de compatibilité entre les bibliothèques
  • Fichier manifest.mf affiché dans l'explorateur Windows.
    Variables du fichier manifest.mf avec des éléments mis en évidence : build-jdk-spec : 1.8 et main-class : org.example.main.

b. Création du projet

Fichiers décrits avec des cadres colorés autour d'eux.
  1. Jaune : fichiers ressources
  2. Violet : librairies
  3. Vert : fichiers sources du projet
  4. Bleu : META-INF (uniquement utile pour les informations qu'il contient). Il n'est pas ajouté au nouveau projet

c. Trier et rassembler les sources

Créez un nouveau projet dans un IDE de votre choix. Pour ce projet, j'ai utilisé IntelliJ IDEA Community Edition.

  • Assignez Maven comme gestionnaire de projet
  • Sélectionnez le JDK approprié (par exemple, JDK 1.8 pour cet exemple)
  • Création d'un projet nommé 'recreate-java-project' sur IntelliJ IDEA.
    Arborescence de base d'un projet sur IntelliJ IDEA.
  • Remplacez et déposez les sources du projet et les fichiers deconfiguration dans le répertoire /src/java/main/ du nouveau projet
  • Le fichier main.java dans le chemin précédemment cité.
  • Placez les dossiers ne contenant pas de fichiers .java dans le répertoire des ressources
  • Dossiers 'conf' et 'images' situés dans le chemin spécifié précédemment.
  • Identifiez, une à une, les librairies manquantes pour les réintégrer proprement dans le nouveau projet
  • Dans meta-inf/maven/, vous pouvez retrouver le fichier pom.xml d'origine et y identifier les librairies nécessaires
  • Fichier pom.xml situé dans le chemin spécifié précédemment.
    Description des paramètres du fichier pom.xml.
  • On positionne toutes les définitions dans notre nouveau pom.xml
  • Fichier pom.xml du projet 'recreate-java-project' avec les définitions de bibliothèques ajoutées.
    Erreur détectée par le compilateur IntelliJ IDEA.

Lors de chaque tentative de build du projet, les erreurs vous indiqueront les bibliothèques manquantes.

d. Récupération des librairies

Pour récupérer les librairies, on peut utiliser des sites internet spécialisés, comme : Maven central pour récupérer les librairies connus. Exemple avec Maven repository :


  1. Identifiez la librairie manquante dans les déclarations
  2. Page de code de main.java avec un import marqué en rouge par le compilateur.
  3. Effectuez une recherche Google
  4. Recherche Google de l'erreur affichant le nom de la bibliothèque suivi de 'Maven Central'.
  5. Choisissez la version appropriée
  6. Page du site MVN Repository pour la bibliothèque args4j présentant les différentes versions disponibles.
  7. Copiez la déclaration dans le fichier pom.xml
  8. Code de déclaration de la bibliothèque args4j sur le site MVN Repository.
    Ajout de la déclaration de la bibliothèque args4j dans le fichier pom.xml du projet 'recreate-java-project'.
  9. Compilez les sources avec la commande suivante :
  10. bash

    mvn clean install

Si une bibliothèque n'est pas présente sur Maven Central, vous pouvez utiliser des repositories comme JFrog Artifactory. Pour ajouter des bibliothèques depuis JFrog Artifactory, suivez leur documentation. Pour les bibliothèques téléchargées manuellement ou à conserver hors ligne, vous pouvez créer un repository local Maven. Consultez mon tutoriel : Comment créer un repository local avec Maven ?

Troisième étape : Compiler les sources du projet

a. Configuration de la variable path JAVA_HOME

Pour compiler le projet, assurez-vous que la version du JDK est active dans le projet et sur votre path JAVA_HOME. Cela garantit une version cohérente entre l'environnement de développement et les commandes en ligne de commande.

Icône 'i' entourée d'un cercle, indiquant un message important.Une différence entre la version du JDK utilisée par l'IDE et celle définie dans JAVA_HOME peut entraîner des erreurs, notamment lors de l'exécution du projet via la commande javac.

Assurez-vous d'avoir correctement configuré JAVA_HOME pour permettre l'exécution en terminal ou en fenêtre CMD.

Variable système JAVA_HOME affichée dans la fenêtre des variables d'environnement Windows.

b. Déboguer les sources

Une liste des problèmes rencontrés :

  • Les variables ne sont plus nommées correctement
  • Des caractères apparaissant de manière aléatoire
  • Les chemins ne sont plus accessibles pour les images ou fichiers de configuration, car ils sont en absolu et non relatifs
  • Les librairies ne sont pas déclarées dans le bon scope
  • Différents paramètres de scope dans une déclaration Maven et leurs zones d'application respectives.
  • Les versions des librairies ne sont pas adaptées : trop avancées ou trop anciennes

Une fois que tout est débogué et que le projet compile correctement, il est possible de tester le projet directement depuis l'IDE ou en le recompilant au format FAT JAR. Ensuite, il faut vérifier que tout fonctionne comme prévu. Dans mon cas, j'ai dû passer par une seconde phase de débogage pour résoudre les derniers problèmes.

Conclusion

Le projet s'est terminé par la génération d'un FAT JAR (également appelé UBER JAR). Le passage au FAT JAR demande quelques connaissances, notamment pour bien comprendre la déclaration du build dans les fichiers assembly.xml. Voici les tutoriels qui m'ont aidé à configurer mon fichier FAT JAR :


C'est un long projet que de récupérer les sources complètes et de reconstruire un projet Java fonctionnel et éditable dans un IDE. Il est crucial de toujours disposer d'un code source à jour avec son exécutable, surtout lorsqu'on travaille avec des sous-traitants, afin d'éviter ce type de problème.

Je tiens à remercier Vincent F et Mitvailer pour leur aide précieuse en tant que mentors Java à des moments clés du projet. Sans eux, je n'aurais pas réussi ce projet à temps.

×