2009-06-06 9 views
4

J'ai une classe qui se trouve dans un paquet appelé com.toptur.sysTray tout ce qu'il fait est le plateau du système de chargement, il n'utilise pas de paquets externes. Je crée un objet SysTray pour installer la barre d'état système. Tout se construit bien. Je peux lancer l'application à partir de la ligne de commande et systray est installé. Mais quand j'essaye de créer un pot à partir des fichiers de classe et que je l'exécute, j'obtiens NoClassDefFoundError.NoClassDefFoundError inside jar

Le package et ses fichiers de classe sont dans le fichier mon application n'utilise pas de fichiers externes. juste des cours provited by java.

Et si construire un fichier .exe hors du pot, il recommence à fonctionner sans aucune erreur.

Comment puis-je suivre cela?

<target name="jar" depends=""> 
    <jar destfile="build/toptur.jar" > 
    <manifest> 
     <attribute name="Built-By" value="Toptur"/> 
     <attribute name="Main-Class" value="gotacan"/> 
    </manifest> 
    <fileset dir="build"> 
     <include name="**/*.class"/> 
    <include name="**/*.png"/> 
<exclude name="**/*.jar"/> 
    </fileset> 
</jar> 

je crée le fichier jar à partir d'une cible en utilisant ant code ci-dessus. Le programme du pilote n'est pas dans un package. il se trouve dans gotacan.java

je lance à l'aide jar java toptur.jar

reste du programme fonctionne, il jette seule exception quand je tente d'utiliser ce package.

+0

Comment créer votre fichier jar et comment voulez-vous exécutez il? – kgiannakakis

+0

Pouvez-vous montrer toute la trace de la pile NoClassDefFound? –

+1

votre classe est-elle vraiment nommée "gotacan" avec une lettre minuscule en première lettre? – Billy

Répondre

1

Je suppose que votre manifeste manque soit la désignation de la classe principale, soit un chemin de classe, soit le jar n'inclut pas correctement le chemin du répertoire du paquet. Un tutorial peut aider. Le tien semble assez simple là où c'est une petite chose que tu as oubliée. MISE À JOUR: Le nom de la classe principale doit être le nom de classe entièrement résolu, y compris le package complet. Si votre classe est dans un paquet, c'est là que vous vous êtes trompé.

+0

cass principal n'est pas dans un paquet. reste des composants sont. toutes les autres classes sont résolues très bien sauf cette seule. tous les paquets sont dans le dossier com.toptur –

3

L'exception Classe non trouvée doit mentionner le nom de la classe recherchée.

Puisque vous avez seulement le jar sur le classpath, il devrait être dans le jar, mais ce n'est pas le cas. Figure pourquoi, les raisons possibles:

  • le fichier de classe ne sont pas là où il appartient quand fourmi construit le paquet
  • la structure des répertoires représentant le nom du package ne s'enracine pas où toutes les autres classes sont enracinées
  • la endroit où le fichier de classe appartient n'est pas inclus dans la liste des fichiers à mettre dans le pot par ant.

Bonne chance

Note: les pots ne sont que des fichiers zip avec une attitude, de sorte que vous pouvez utiliser tout programme zip pour vérifier quels fichiers sont en fait là-dedans.

+0

Il peut aussi simplement utiliser jar xvf toptur.jar à partir de la ligne de commande pour extraire le pot. –

+0

true (en supposant que les paramètres soient corrects) mais peu le savent par cœur, alors que presque tous les développeurs savent utiliser au moins un outil zip –

+0

Notez également qu'une seule classe peut générer plusieurs fichiers .class en fonction de la composition de la classe. –

0

Probablement dépend de l'environnement JRE que vous exécutez le programme par rapport à la machine virtuelle Java que vous utilisez pour générer et pour générer le fichier .exe avec.

La fonctionnalité systray est tout à fait nouveau (java6), donc si vous avez un vieux JRE ou JVM sur le chemin du système lorsque vous exécutez

java -jar toptur.jar 

Il peut trouver la classe que vous avez écrit, mais pas les classes qu'il utilise à partir du JRE.

0

J'ai eu un problème similaire lorsque j'essayais de faire un pot en utilisant ant pour un projet open source. Je suis entré en contact avec les auteurs, et ils ont utilisé eclipse pour exporter le pot à la place. J'ai mimé ce qu'ils ont suggéré et j'ai trouvé une différence nette dans la taille des fichiers jar. Je n'ai pas pris le temps de déterminer la différence qui faisait que l'un fonctionnait et l'autre non. Cependant, vous pouvez être en mesure d'utiliser un processus similaire pour que votre matériel fonctionne correctement. Si oui, vous pouvez peut-être regarder la différence et de partager le résultat avec nous :)

Voici un lien vers mon problème et la solution: Xerces-for-Android NoClassDefFoundError When Using Jar Instead of Source Code