Comment puis-je ouvrir et voir un fichier dans un fichier jar à partir de Terminal ?
Je peux utiliser less pour imprimer tous les fichiers contenus dans le fichier jar, mais comment puis-je ouvrir ces fichiers ?
Comment puis-je ouvrir et voir un fichier dans un fichier jar à partir de Terminal ?
Je peux utiliser less pour imprimer tous les fichiers contenus dans le fichier jar, mais comment puis-je ouvrir ces fichiers ?
Personnellement, j'utilise jar
parce qu'elle semble plus naturelle et qu'elle permet également d'autres opérations telles que la mise à jour du contenu. Voici les commandes de lecture :
Liste des contenus
jar tf myjar.jar
Extraire le contenu de pwd
jar xf myjar.jar
Extraction d'un fichier spécifique, en créant des répertoires si nécessaire
jar xf myjar.jar /foo/bar.class
L'extraction du bytecode lui-même n'est généralement pas très utile. Pour le comprendre, il faut le décompiler en quelque chose de lisible.
Il n'y a pas beaucoup de bons décompilateurs Java parmi lesquels choisir. J'ai tendance à utiliser JD-GUI Il est rapide et fait ce dont j'ai besoin. Malheureusement, sa fonction de recherche multi-fichiers ne fonctionne jamais pour moi (notez que la recherche Ctrl+F sur la page fonctionne bien). Ce n'est pas une grande perte cependant ; vous pouvez faire en sorte qu'il transfère toutes les sources sur le disque avec Ctrl+Alt+S pour les consulter avec grep/vim/Eclipse, etc.
Je l'installe comme suit :
wget http://jd.benow.ca/jd-gui/downloads/jd-gui-0.3.5.linux.i686.tar.gz
tar xzf jd-gui-0.3.5.linux.i686.tar.gz
sudo mv jd-gui /usr/local/bin/
sudo chown root:root /usr/local/bin/jd-gui
sudo chmod 755 /usr/local/bin/jd-gui
L'utilisation se fait de la manière suivante :
jd-gui myjar.jar
Ctrl+Alt+S; pick your path & save
Alt+F4
jar xf <path>/myjar.src.zip
Notez cependant que JD-GUI n'a pas d'interface CLI. Si vous connaissez un bon décompilateur CLI, je serais très intéressé de le connaître (il y a JAD, mais AFAIK qui ne supporte que Java < 1.5).
En utilisant unzip, vous pouvez envoyer un fichier de l'archive vers stdout et ensuite vers quelque chose d'autre pour le lire, comme par exemple :
unzip -p /path/to/some.jar path/to/file/inside/jar | less
De mémoire, unzip n'est pas installé par défaut, vous pourriez donc en avoir besoin :
sudo apt-get install unzip
Jeff
Les fichiers jar ne sont en fait que des fichiers zip, ce que vous pouvez vérifier en faisant.
file foo.jar
Ainsi, pour lister les fichiers, il suffit de faire.
unzip -l foo.jar
Pour accéder aux fichiers, il suffit de décompresser le fichier avec
unzip foo.jar
Si vous souhaitez extraire un seul fichier, ajoutez les fichiers après
unzip foo.jar some/path/in/jar/bar.class
Veillez à utiliser le chemin complet indiqué par -l. Et gardez à l'esprit qu'il créera le même chemin localement.
(Pas de points de fidélité, donc je dois répondre aux commentaires de @Kurro)
unzip (-p | -c) <jar-file> <file-in-jar>
En -p
y -c
permettent d'extraire le fichier vers la sortie standard ; -c
donne deux lignes de données supplémentaires au début (quel fichier JAR et quel fichier dans l'archive).
J'ai trouvé cela très pratique pour lire le fichier Manifest ou les fichiers .xml. Pour le fichier .class
fichiers, c'est inutile, mais votre ami ici présent est javap
:
javap -classpath <jar-file> <fully.qualified.class.name> # without the .class suffix
Voici quelques options utiles : -c
(décompilation en Java Assembly), -private
pour afficher également les champs privés, et -verbose
pour de nombreuses informations supplémentaires. S'il s'agit d'un gros fichier, vous voudrez peut-être faire passer la sortie par l'intermédiaire de less
.
SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.