2010-11-12 32 views
0

désolé à l'avance si je ne donne pas assez d'informations ou si je ne sais pas quoi que ce soit, c'est ma première incursion dans l'utilisation .bat et .config fichiers. J'utilise un logiciel académique et j'essaie d'ajouter et d'exécuter mes propres composants. le système utilise un fichier de configuration pour lancer une liste de composants (classes) nécessaire pour le système en utilisant le code comme ceci:Impossible de résoudre java NoClassDefFoundError mais tout semble correct ... des idées?

semaine.components = \ 
eu.semaine.examples.swimmer.SwimmerDisplay| \ 

le système fonctionne correctement et sont initialisés les composants spécifiés.

ajouter mon propre composant à la liste des composants existants en utilisant le code suivant:

eu.semaine.examples.TestPackage.MyTest| \ 

mais je reçois l'erreur suivante:

java.lang.NoClassDefFoundError:eu/semaine/examples/TestPackage/MyTest (wrong name: TestPackage/MyTest)

J'ai eu un coup d'oeil et me semble que je ne fais aucune des choses qui causent généralement cette erreur, par exemple mon nom de classe correspond au nom de fichier dans lequel il est stocké (classe publique MyTest est stocké dans MyTest.java), MyTest est dans le package TestPackage et le dossier dans la structure de fichier est également nommé TestPackage.

des idées ou des conseils seraient grandement appréciés.

Répondre

2

Vous avez demandé

eu.semaine.examples.TestPackage.MyTest 

mais dire que vous avez placé le fichier dans un répertoire appelé TestPackage.

Examinez attentivement le chemin de classe spécifié dans votre fichier séquentiel. Je pense que vous avez une hiérarchie de répertoires comme celui-ci pour le choc initial, enraciné à ce classpath spécifié

eu 
    semaine 
    examples 
     swimmer 
      SwimmerDisplay 

en disant eu.semaine.examples.TestPackage.MyTest vous dites que le paquet sera « eu. semaine.examples.TestPackage » et la hiérarchie des répertoires sera désormais

eu 
    semaine 
    examples 
     swimmer 
      SwimmerDisplay.class 
     TestPackage 
      MyTest.class 

Je pense que vous avez l'intention à la place:

eu 
    semaine 
    examples 
     swimmer 
      SwimmerDisplay.class 
TestPackage 
    MyTest.class 

et dire que la classe est juste

TestPackage.MyTest 

pas

eu.semaine.examples.TestPackage.MyTest 

[En passant j'ai gree que la convention normale n'est pas de capitaliser les noms de paquet, mais je ne crois pas que Java déduit et sémantique de la capitalisation.]

+0

Salut, j'ai tout dans un pot et la hiérarchie des dossiers est la suivante: myJar> eu> semaine> examples. examples contient le dossier swimmer (contenant SwimmerDisplay.class) et le dossier TestPackage (contenant MyTest.class). Je vais essayer de changer le nom du paquet en minuscules juste au cas où. – chris

+0

Je pense que votre dossier TestPackage ne devrait pas être dans le répertoire des exemples, mais plutôt dans la racine du Jar, et vous devriez ajuster la façon dont vous le référenciez comme je le montre dans ma réponse. Regardez votre code, s'il dit paquet "TestPackage" alors je suis sûr que j'ai raison. – djna

+0

Cela a fonctionné. Merci beaucoup. – chris

0

Il semble que votre classe ne se trouve pas dans le chemin de classe de l'application au démarrage. Vous mentionnez les fichiers .bat. Si c'est ainsi que vous démarrez l'application, elle doit contenir une section où le classpath est assemblé. Il doit contenir le dossier parent du dossier TestPackage pour que la machine virtuelle Java sache où trouver votre fichier de classe.

0

La convention de dénomination stipule que les noms de package doivent être en minuscules, voir http://download.oracle.com/javase/tutorial/java/package/namingpkgs.html.

Je suppose que le jvm pense que TestPackage est une classe et MyTest est une classe interne.

+0

ok, je vais essayer de changer le cas et voir si cela fonctionne. – chris

+0

a changé le cas de sorte qu'il lit "testpackage" mais cela n'a pas aidé. – chris