2009-09-14 5 views
3

Je reçois une exception "no class definition found" en essayant d'exécuter mon application sous Windows (elle fonctionne bien sous OS X). Les classes dont se plaint la JVM sont mes classes (pas de jar tiers requis). Lorsque je décompresse les fichiers dans le fichier jar, tous les fichiers sont présents, y compris ceux sur lesquels JVMm se plaint.NoClassDefFoundError en cours d'exécution à partir de jar

Le pot est créé en utilisant la tâche suivante:

<target name="jar" depends=""> 
<jar destfile="build/app.jar" > 
    <manifest> 
    <attribute name="Built-By" value="hamza"/> 
    <attribute name="Main-Class" value="com.hamza.driver.ui"/> 
<attribute name="Class-Path" value="./"/> 
    </manifest> 
    <fileset dir="build"> 
    <include name="**/*.class"/> 
<include name="**/*.png"/> 
<include name="**/*.xpi"/> 
<include name="**/*.html"/> 
<exclude name="**/*.jar"/> 
    </fileset> 
</jar> 

Je ne peux pas comprendre ce qui est à l'origine du problème. Si je décompresse le fichier jar et exécute le fichier jar du répertoire dans lequel j'ai décompressé la classe, tout fonctionne correctement. Donc, je suppose que tous les fichiers requis sont à l'intérieur du pot.

EDIT: com.hamza.driver.ui est une classe dans un package appelé com.hamza.driver qui a main. Après la construction, j'obtiens un pot "app.jar", et je le lance en utilisant "java -jar app.jar", qui s'exécute correctement sous OS X, mais pas sous Windows.

Si je décompresse app.jar dans un répertoire séparé et exécute "java -jar app.jar", il excute bien.

EDIT 2: exception:

 
Exception in thread "main" java.lang.NoClassDefFoundError: com/hamza/gui/tr 
ansfer/ClipboardTransferHandle 
     at com.hamza.driver.ui.main(Unknown Source) 
Caused by: java.lang.ClassNotFoundException: com.hamza.gui.transfer.Clipboa 
rdTransferHandle 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at java.lang.ClassLoader.loadClassInternal(Unknown Source) 
     ... 1 more 

ClipboardTransferHandle Les fichiers sont présents dans le pot.

EDIT 3: les importations pour la classe carte clip:

 
import java.util.logging.Logger; 
import java.awt.datatransfer.Clipboard; 
import java.awt.datatransfer.ClipboardOwner; 
import java.awt.datatransfer.Transferable; 
import java.awt.datatransfer.StringSelection; 
import java.awt.datatransfer.DataFlavor; 
import java.awt.datatransfer.UnsupportedFlavorException; 
import java.awt.Toolkit; 
import java.io.IOException; 

Tout en jouant avec elle, je trouve que si j'essaie de déclarer ClipboardTransferHandle comme une variable statique dans le pilote, cela fonctionne, mais chaque objet n'est pas statique n'est pas trouvé. Tous les éléments principaux de l'interface graphique sont des variables statiques, donc l'interface graphique est construite, mais les autres éléments ne le sont pas; tout ce qui est créé n'est pas statique, mais si je les déclare statiques pour les tests, ils fonctionnent.

+0

Vous pouvez essayer sans l'attribut Class-Path, et vérifiez si vous reproduisez le problème. – VonC

+1

Afficher la commande d'invocation exacte - comme "java -jar my.jar". Si possible, lien vers le pot en question. –

+0

Quelles sont les importations dans la classe com.hamza.gui.tr ansfer.ClipboardTransferHandle? –

Répondre

0

Avez-vous spécifié le nouveau fichier jar dans votre classpath (java -cp.; New.jar MainClass.class)?

1

Quelle classe manque? Votre attribut Main-Class semble un peu suspect - est-ce que com.hamza.driver.ui est une classe ou un paquet?

+0

+1 crois que c'est l'erreur, aussi – Daniel

1

Il y a une chance, que le NoClassDefFoundError (je déteste vraiment cette erreur - me rend toujours fou ...) n'est pas levé parce qu'il ne trouve pas la classe qu'il vous dit (-> votre classe) mais parce que Java ne peut pas trouver l'une des classes utilisées pour instancier cette classe.

J'ai eu ce problème une fois, lorsqu'une classe importait une autre classe d'un autre pot (dans mon cas: un paquet OSGi) qui n'avait pas été exporté correctement. Bien que ce soit un problème spécifique à OSGi - Vous pouvez avoir les mêmes problèmes dans votre environnement. Peut-être que votre application dépend de certaines classes présentes dans votre environnement OS-X réel, mais pas dans l'environnement Windows réel. Je ne regarde pas les bibliothèques tierces mais les implémentations Java elles-mêmes.

Bonne chance!

Modifier

Il y a deux questions plus assez similaires sur le SO, malheureusement sans solution acceptée, mais peut-être l'un des conseils là-bas peut aider dans votre cas:

NoClassDefFound when running a jar

NoClassDefFoundError inside jar

Édition 2

Voici un problème similaire que a une réponse acceptée. Espérons que cela aide la:

NoClassDefFoundError while trying to run my jar with java.exe -jar...what's wrong?

+0

mais si c'est le cas, cela ne devrait pas fonctionner quand je le décompresser. mais ça marche. –

+0

Ah - OK, n'a pas lu assez attentivement. –

+0

Je veux juste que vous sachiez que, 7 ans plus tard, vous m'avez sauvé de beaucoup (plus) de frustration, merci! – aRk

2

C'est le problème qui se produit,

si le fichier JAR a été chargé de "C: \ java \ apps \ appli.jar", et votre fichier manifeste a le Class-Path: référence "lib/other.jar", le chargeur de classe cherchera dans "C: \ java \ apps \ lib \" pour "other.jar". Il ne regardera pas l'entrée du fichier JAR "lib/other.jar".

Solution: -

  1. Faites un clic droit sur le projet, sélectionnez Exporter.
  2. Sélectionnez le dossier Java et sélectionnez le fichier JAR exécutable au lieu du fichier JAR.
  3. Sélectionnez les options appropriées et, dans la section Gestion des bibliothèques, sélectionnez la 3ème option, c'est-à-dire (Copiez les bibliothèques requises dans un sous-dossier en regard du fichier JAR généré).
  4. Cliquez sur Terminer et votre fichier JAR est créé à la position spécifiée avec un dossier contenant les fichiers JAR mentionnés dans le fichier manifeste.
  5. ouvrir le terminal, donner le bon chemin à votre pot et l'exécuter en utilisant cette commande java -jar abc.jar

    Maintenant, ce qui va se passer est le chargeur de classe se penchera dans le dossier correct pour les POTS référencés depuis maintenant, ils sont présents dans le même dossier qui contient votre application JAR .. Il n'y a pas d'exception "java.lang.NoClassDefFoundError" levée maintenant.

    Cela a fonctionné pour moi ... J'espère que ça marche aussi!

Questions connexes