J'ai créé un fichier JAR dans Windows 7 à l'aide d'Eclipse. Lorsque j'essaie d'ouvrir le fichier JAR, il indique un fichier JAR invalide ou corrompu. Quelqu'un peut-il me suggérer pourquoi le fichier jar est invalide?
Cela se produit lorsque vous double-cliquez sur un fichier JAR dans l'Explorateur Windows, mais que ce dernier n'est en réalité pas un exécutable JAR. Un fichier JAR exécutable réel doit avoir au moins une classe avec une méthode main()
et la référencer dans MANIFEST.MF
.
Dans Eclispe, vous devez exporter le projet sous forme de fichier JAR Runnable au lieu de fichier JAR pour obtenir un fichier JAR exécutable.
Ou, si votre fichier JAR est uniquement un conteneur regroupant plusieurs classes étroitement liées (une bibliothèque), vous ne devez pas le double-cliquer, mais l'ouvrir à l'aide d'un outil Zip. L’explorateur Windows associe par défaut les fichiers JAR à Java.exe
, ce qui ne fonctionnera pas avec ce type de fichiers JAR de bibliothèque.
Cela se produit régulièrement lorsque vous modifiez l'extension du fichier JAR pour Zip, extrayez le contenu du fichier Zip et apportez des modifications à des fichiers tels que le fichier MANIFEST.MF, ce qui est un cas très courant. Eclipse ne génère généralement pas le fichier MANIFEST. nous voulons, ou peut-être voudrions-nous en modifier les valeurs CLASS-PATH ou MAIN-CLASS.
Le problème se produit lorsque vous compressez le dossier dans le dossier.
Un JAR Runnable/Executable valide a la structure suivante:
myJAR (Main-Directory)
|-META-INF (Mandatory)
|-MANIFEST.MF (Mandatory Main-class: com.MainClass)
|-com
|-MainClass.class (must to implement the main method, mandatory)
|-properties files (optional)
|-etc (optional)
Si votre fichier JAR est conforme à ces règles, cela ne fonctionnera pas si vous l'utilisez manuellement à l'aide d'un outil Zip, puis vous modifiez l'extension en .jar.
Une fois que vous avez terminé, essayez de l'exécuter sur la ligne de commande en utilisant:
Java -jar myJAR.jar
Lorsque vous utilisez un outil Zip pour décompresser, modifier les fichiers, puis à nouveau Zip, normalement, la structure JAR change en cette structure qui est incorrecte, car un autre niveau de répertoire est ajouté en haut du système de fichiers, ce qui en fait un fichier corrompu, comme indiqué ci-dessous:
**myJAR (Main-Directory)
|-myJAR (creates another directory making the file corrupted)**
|-META-INF (Mandatory)
|-MANIFEST.MF (Mandatory Main-class: com.MainClass)
|-com
|-MainClass.class (must to implement the main method, mandatory)
|-properties files (optional)
|-etc (optional)
:)
Le problème est peut-être qu’il ya plus de 65 536 fichiers dans votre fichier JAR: Pourquoi Java se plaint-il des fichiers JAR contenant de nombreuses entrées? Le correctif est décrit dans answer de cette question.
Peut-être en raison d'un problème avec MANIFEST.MF
. Essayez de démarrer la classe principale avec la commande suivante si vous connaissez le paquet contenant la classe principale.
Java -cp launcher/target/usergrid-launcher-1.0-SNAPSHOT.jar co.pseudononymous.Server
C'est le problème commun avec "manifeste" dans l'erreur? Oui ça arrive souvent, voici un lien: http://dev-answers.blogspot.com/2006/07/invalid-or-corrupt-jarfile.html
Solution:
Utiliser la tâche ant pour créer le fichier manifeste à la volée vous donne une entrée comme celle-ci:
Manifest-Version: 1.0 Ant-Version: Apache Ant 1.6.2 Created-By: 1.4.2_07-b05 (Sun Microsystems Inc.) Main-Class: com.example.MyMainClass
La création du fichier manifeste moi-même, avec l'essentiel, résout le problème:
Manifest-Version: 1.0 Main-Class: com.example.MyMainClass
Avec plus d'investigation, je suis sûr que j'aurais pu utiliser la création dynamique de méta-fichiers avec Ant comme je connais d'autres personnes - il doit y avoir une particularité dans la combinaison de ma version ant (1.6.2) et de la version Java (1.4. 2_07) et peut-être la phase actuelle de la lune.
Remarques:
L'analyse du fichier Meta-inf est un problème qui a été résolu, puis corrigé, puis réapparu pour Sun. Voir: Identifiant de bogue: 4991229 . Si vous pouvez déterminer si ce bogue existe dans votre version (ou la ma) de Java SE, vous avez plus de patience que moi.
Ce peut être une faute de frappe dans le MANIFEST.MF
aussi, p.ex. Date de fabrication avec deux :
Build-Date:: 2017-03-13 16:07:12
Essayez d'utiliser la commande jar -xvf nomFichier.jar, puis exportez le contenu du fichier décompressé dans un nouveau projet Java dans Eclipse.
Assurez-vous également que la version de Java utilisée à l'exécution est une version équivalente ou ultérieure à celle utilisée par Java lors de la compilation
Si le fichier jar contient des octets supplémentaires à la fin, les explorateurs tels que 7-Zip peuvent l'ouvrir, mais ils seront traités comme corrompus. J'utilise un système de téléchargement en ligne qui ajoute automatiquement un seul caractère supplémentaire LF ('\ n', 0x0a) à la fin de chaque fichier jar. Avec de tels fichiers, il existe diverses solutions pour exécuter le fichier:
head -c -1 myjar.jar
), puis exécutez le fichier jar en double-cliquant ou avec Java -jar myfile.jar
normalement. Toutes ces solutions nécessitent que la structure du fichier .Zip et du fichier META-INF soit essentiellement correcte. Ils ont seulement été testés avec un seul octet supplémentaire à la fin du fichier Zip "corrompant".
Je me suis mis dans le pétrin en appliquant deux fois le head -c -1 *.jar > tmp.jar
. head
a inséré le texte ASCII ==> myjar.jar <==
au début du fichier, le corrompant complètement.