web-dev-qa-db-fra.com

Impossible de trouver ou de charger la classe principale avec un fichier Jar

J'essaie de charger un bocal en utilisant

@echo off
Java -jar Test.jar
pause

Avec le manifeste de 

Manifest-Version: 1.0
Main-Class: classes.TestClass

Dans le répertoire Jar, je peux clairement voir un fichier classes\TestClass lorsque je l'extrais.

Edit: classes.TestClass a une public static void main(String[] args)

La décélération du package dans classes.TestClass est package classes;

Mais je continue à recevoir le message d'erreur 

Could not find or load main class classes.TestClass

J'ai parcouru tout ce que j'ai pu trouver avec ce problème, et rien de tout cela ne semble aider.

J'ai essayé d'éditer le classpath, de refaire le manifeste, d'installer le nouvel environnement d'exécution JRE 

Que devrais-je faire d'autre? 

32
Austin

Je l'ai eu comme ça:

TestClass.Java

package classes;

public class TestClass {

    public static void main(String[] args) {
        System.out.println("Test");
    }

}

Utilisez javac sur la ligne de commande pour générer TestClass.class. Placez TestClass.class dans un dossier classes/.

MANIFEST.MF

Manifest-Version: 1.0
Main-Class: classes.TestClass

Puis courir

jar cfm test.jar MANIFEST.MF classes/

Puis lancez le en tant que

Java -jar test.jar
21
BeRecursive

Java -cp "chemin-complet-de-votre-jar" Main

d'exécuter toute autre classe ayant "main static statique publique" dans un package,

Java -cp "chemin-complet-de-votre-jar" package1.package2.packages-hierarchy.ClassHavingMain

16
Kalidas Y

1.Créez un fichier texte appelé Manifest.txt et indiquez la valeur 

Classe principale: classes.TestClass

2.Créez le pot comme 

jar cfm test.jar Manifest.txt classes/*. class

3.Lancez le pot comme 

Java -jar test.jar

9
Arham

J'ai juste eu le même problème à la fin parce que j'ai copié et collé le code dans Word et que c'était un type légèrement différent de caractère '-' utilisé, c'est tout ce à quoi je peux penser, quand je l'ai tapé manuellement, cela a fonctionné

4
Max Carroll

J'ai eu un problème similaire que je pouvais résoudre en accordant un privilège d'exécution à tous les dossiers parents dans lesquels se trouve le fichier jar (sur un système linux). 

Exemple:

/folder1/folder2/folder3/executable.jar

les 3 dossiers (folder1, folder2 et folder3) ainsi que le fichier executable.jar nécessitent un privilège d'exécution pour l'utilisateur actuel, sinon l'erreur "Impossible de trouver ou de charger la classe principale ..." est renvoyée.

2
Alex

C'est très difficile à déboguer sans informations complètes.

Les deux choses les plus probables à ce stade sont que le fichier dans le fichier jar n'est pas stocké dans un répertoire WITHIN THE JAR ou qu'il ne s'agit pas du fichier correct.

Vous devez stocker TestClass.class - certaines personnes nouvelles dans ce magasin stockent le fichier source, TestClass.Java.

Et vous devez créer le fichier jar afin que TestClass.class apparaisse avec un chemin de classes. Assurez-vous que ce n'est pas "/ classes". Utilisez Zip pour regarder le fichier et assurez-vous qu’il a un chemin de "classes".

2
arcy

Je suis les instructions suivantes pour créer un fichier .jar exécutable dans Eclipse. Ensuite, exécutez la commande "Java -jar .jar" pour lancer le programme.

Il s’occupe de la création du mainfest et de l’inclusion des parties de fichiers de classe et de bibliothèque principales pour vous.

http://Java67.blogspot.com/2014/04/how-to-make-executable-jar-file-in-Java-Eclipse.html

1
user1457659

Au moins la façon dont je l'ai fait est la suivante:

Si vous avez une arborescence src imbriquée (par exemple, com.test.myclass.MyClass) et que vous compilez à partir d'un répertoire racine, procédez comme suit:

1) lors de la création du fichier jar (généralement placé dans un script): jar -cvfm my.jar avec/test/myclass/manifeste.txt avec/test/myclass/MyClass.class

2) Le manifeste devrait ressembler à:

Mainfest-version: 1.0 Classe principale: com.test.myclass.MyClass Class-Path:. my.jar

3) Maintenant, vous pouvez lancer le pot de n'importe où comme ceci:

Java -jar my.jar

J'espère que cela aide quelqu'un

1
Ramjet

J'ai eu un problème étrange quand une entrée incorrecte dans MANIFEST.MF causait un échec de chargement. C’était à ce moment-là que j’essayais de lancer un programme très simplement scala:

Incorrect:

Main-Class: jarek.ResourceCache
Class-Path: D:/lang/scala/lib/scala-library.jar

Correct:

Main-Class: jarek.ResourceCache
Class-Path: file:///D:/lang/scala/lib/scala-library.jar

Avec une version incorrecte, je recevais un message crypté, identique à celui utilisé par l'OP. Il devrait probablement indiquer quelque chose comme l'exception malformed url lors de l'analyse du fichier manifeste.

IntelliJ utilise un chemin absolu dans le fichier manifeste pour fournir un long chemin de classe à un programme.

1
Jarekczek

Je sais que c’est une vieille question, mais j’ai eu ce problème récemment et aucune des réponses ne m’a aidé. Cependant, le commentaire de Corral sur la réponse de Ryan Atkinson m'a permis de comprendre le problème.

J'ai eu tous mes fichiers de classe compilés dans target/classes, qui ne sont pas des paquets dans mon cas. J'essayais de le conditionner avec jar cvfe App.jar target/classes App, à partir du répertoire racine de mon projet, car ma classe App était dans le package par défaut non nommé.

Cela ne fonctionne pas, car le App.jar nouvellement créé aura la classe App.class dans le répertoire target/classes. Si vous essayez d'exécuter ce fichier jar avec Java -jar App.jar, il se plaindra de ne pas trouver la classe App. Cela est dû au fait que les packages contenus dans App.jar ne correspondent pas aux packages réels du projet.

Cela pourrait être résolu en créant le fichier jar directement à partir du répertoire target/classes, en utilisant jar cvfe App.jar . App. C'est assez lourd à mon avis.

La solution simple consiste à répertorier les dossiers que vous souhaitez ajouter avec l'option -C au lieu d'utiliser la méthode par défaut de listage des dossiers. Donc, dans mon cas, la commande correcte est Java cvfe App.jar App -C target/classes .. Cela ajoutera directement tous les fichiers du répertoire target/classes à la racine de App.jar, résolvant ainsi le problème.

0
Log2

J'ai reçu le même message d'erreur après le transfert du fichier jar par FTP et j'ai oublié de le définir en mode binaire.

0
vincent

J'ai eu cette erreur parce que j'ai écrit un mauvais Class-Path dans mon MANIFEST.MF

0
Sadap