java.lang.ClassNotFoundException lors de l'exécution de java-jar
Je suis en utilisant ant pour construire mon build.xml
fichier, il compile ok, mais alors l'obtention d'un runtime java.lang.NoClassDefFoundError
lors de l'exécution de l'résultant jar via "java -jar my_jar.jar
". Il semble que cela vient d'un lot, mais aucune des questions liées à des "solutions" a fonctionné pour moi.
Mon classpath pour javac
ne contient que des "/usr/local/lib/libthrift.jar
" et le principal .java
importation de fichiers un tas de l'épargne des logiciels tels que org.apache.thrift.transport.TTransportException
.
Lorsque j'essaie d'exécuter le programme via:
java -jar MyClass.jar
J'obtiens l'erreur:
Exception in thread "main" **java.lang.NoClassDefFoundError**: org/apache/thrift/transport/TTransportException
Caused by: java.lang.ClassNotFoundException: org.apache.thrift.transport.TTransportException
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
Could not find the main class: **MyClass**. Program will exit.
Ici sont les choses que j'ai essayé jusqu'à présent qui ne fonctionnent pas:
-
l'ajout d'un drapeau sur la ligne de commande comme "java
-cp /usr/local/lib/libthrift.jar
-jar my_jar.jar
", le résultat est le même message d'erreur comme ci-dessus -
ajoutant
<attribute name="Class-Path" value="./:/usr/local/lib/libthrift.jar"/>
à l'intérieur de mon pot demanifest>
tag, le résultat est le même message d'erreur comme ci-dessus -
ajoutant
-Xbootclasspath/a:/usr/local/lib/libthrift.jar:./
à la ligne de commande java. il résout la première erreur, mais une autre erreur qui apparaît:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Enregistreur
au org.apache.l'épargne.de transport.TServerSocket.<clinit>(TServerSocket.java:36)
au MyClass.start(Source Inconnue)
au MyClass.principale(Source Inconnue)
EDIT:
Si j'en commentaire le code qui instancie les classes manquantes, mais laisser les importations, le code s'exécute bien.
EDIT:
J'ai déménagé mes classes java à un serveur et fait référence à l'MainClass avec le serveur dans le manifeste de l'attribut, mais qui n'a pas de résoudre quoi que ce soit.
OriginalL'auteur Heinrich Schmetterling | 2009-11-25
Vous devez vous connecter pour publier un commentaire.
L'erreur semble effectivement liés à votre
MANIFEST
qui:Class-Path
: voir ce HowToVoir ce HowTo:
la
<attribute name="Main-Class" value="howto.Hello"/>
besoin de spécifier le chemin d'accès complet (paquets) de laMainClass
, pas seulementMainClass
.Si votre classe principale est dans le package par défaut (le sans nom package), je ne suis pas sûr qu'il puisse être référencé par le chargeur (voir ce DONC, la question)
Déplacez votre
JarRunner
dans un paquet, et de déclarer de manière appropriée dans le<attribute name="Main-Class" value="myPackage.JarRunner"/>
élément.Je recommande au moins un paquet de mettre
JarRunner
, au lieu de "sans nom du package"Si j'ajoute mes fichiers java à un package, puis spécifiez le MainClass comme mypackage.JarRunner il ne peut toujours pas trouver la classe. Est-ce la bonne chose?
Cette explication du sens lorsque l'on considère que si je retire le manque org.code apache, mais laisser les importations, il fonctionne ok?
Oui, c'est fait, depuis le
Could not find the main class: MyClass
est effectivement déclenchée par le fait de l'une de ses partie (apache classe) n'est pas trouvé. Donc mon commentaire précédent ne sont pas utiles ici.OriginalL'auteur VonC
Vous devez spécifier tous les autres pots qui sont requis dans votre classpath dans le fichier manifeste avant que vous pouvez exécuter la commande java-jar my-test.jar voici une copie d'un de mes fichiers de manifeste. Avec toutes ces entrées dans le manifeste, je peux spécifier
java -jar db_field_cleaner.jar
et tous les autres pots sont intégrées dans le classpath :Vous pouvez également utiliser Maven, c'est les charges de mieux à ce genre de choses!
OriginalL'auteur James B
Vous avait donné la réponse vous-même 🙂 ajouter tous les pots de votre runtime classpath.Comme vous l'avez dit plus tôt *.pot a résolu un problème, mais les bûcherons ne sont pas en mesure de trouver, il faut donc ajouter log4j.jar le chemin d'accès. L'idée de base est d'ajouter tous les pots nécessaires pour l'exécution dans le classpath.
OriginalL'auteur GustyWind
Les options de ligne de commande pour
java
peut être trouvé ici.La
-jar
et-cp/-classpath
options sont mutuellement exclusives. Le-jar
option nécessite l'utilisation d'un manifeste et les chemins relatifs pour les dépendances devraient être répertoriés dans ce fichier. Mais, pour l'essentiel, le manifeste est un mécanisme facultatif - vous pouvez spécifier les informations requises à l'extérieur au temps de chauffe. Si le manifeste est à l'origine des problèmes, n'utilisez pas un.Je test que vous avez placé tous vos dépendances avec une commande comme ceci:
Noter que le compilateur peut compiler avec succès vos classes, même si toutes les classes qui pourraient être nécessaires à l'exécution ne sont pas présents. Compilation réussira si les dépendances directes de vos classes sont présentes. Les dépendances de vos dépendances ne sont pas nécessaires pour créer le binaire et le compilateur ne contrôlera pas inutilement.
Le message sur
org/apache/log4j/Logger
suggère que vous avez une dépendance manquante sur log4j. Il sera nécessaire d'ajouter cette bibliothèque pour le classpath. Consultez la documentation de l'Épargne de la bibliothèque pour déterminer ses dépendances.OriginalL'auteur McDowell
Le chemin de classe des références dans le fichier manifeste le sont par rapport aux références. Juste pour le débogage, vous pouvez copier tous les bocaux dans le même emplacement que my_jar.jar et essayez de nouveau.
de référence :
http://www.rgagnon.com/javadetails/java-0587.html
OriginalL'auteur aldrin
Vous pourriez essayer d'ajouter les pots pour le nom de domaine du serveur. J'ai eu un problème similaire et cela a fonctionné pour moi, quand je courais dans glassfish. Je voudrais obtenir de ceux qui ne figurent pas des exceptions. Eclipse a reconnu et il a compilé bien, mais quand couru sur le serveur il ne trouve pas le fichier. Essayez de l'ajouter à ce répertoire lib le serveur est installé.
OriginalL'auteur Randnum
C'est le problème qui est survenu,
si le fichier JAR a été chargé de "C:\java\apps\appli.jar" et votre fichier de manifeste a la Class-Path: référence "lib/other.jar", le chargeur de classes sont en "C:\java\apps\lib\" pour "other.jar". Il ne regarde pas le fichier JAR entrée "lib/other.jar".
Solution:-
ouvrez le terminal,donner le bon chemin vers votre bocal et l'exécuter à l'aide de cette commande java-jar abc.jar
Maintenant ce qui va arriver, c'est le chargeur de classe va le chercher dans le dossier approprié pour le référencés POTS depuis maintenant ils sont présents dans le même dossier qui contient votre application JAR..Il n'y a pas de "java.lang.NoClassDefFoundError" exception levée maintenant.
Cela a fonctionné pour moi... j'Espère que ça fonctionne, vous aussi!!!
OriginalL'auteur Gautam Mandsorwale