2010-02-24 7 views
2

Je vais essayer de donner autant de détails que possible ici, pardonnez-moi si certains ne sont pas pertinents. J'ai deux projets en éclipse. Projet 1: com.myworkplace.parent, avec du code dans le package du même nom. Projet 2: com.myworkplace.child, avec le code dans le paquet du même nom (j'ai déplacé mon code dans ce paquet, à partir du paquetage par défaut, si cela fait une différence). Les deux sont situés dans mon dossier d'espace de travail et structurés de la façon dont vous attendez qu'ils soient, autant que je sache.Eclipse classpath et NoClassDefFoundError

J'ai ajouté child au chemin de génération de parent dans eclipse en utilisant Java Build Path -> Projects -> Add. Le fichier .classpath de parent contient l'entrée:

<classpathentry combineaccessrules="false" kind="src" path="/com.myworkplace.child"/> 

ajouter une référence à une classe de com.myworkplace.child.Child dans parent, importer, compiler sans erreur, exécutez et obtenez:

java.lang.NoClassDefFoundError: com/myworkplace/child/Child 

Ce qui donne? Edit: L'application parente est une application RCP, peut-être OSGI (je ne connais pas grand-chose à propos de RCP et d'autres choses liées). Un peu de googling m'amène à croire que cela pourrait avoir quelque chose à voir avec ça.

Répondre

6

Étant donné que votre application est une application RCP, il existe une différence entre le chemin de classe eclipse utilisé lors de l'édition du code et le chemin de classe OSGi utilisé lors de l'exécution. Il semble que vous deviez ajouter le plugin com.myworkplace.child à la liste des dépendances du plugin com.myworkplace.parent.

Ouvrez le fichier plugin.xml ou META-INF/manifest.mf dans le projet parent. Eclipse devrait ouvrir l'éditeur de plugin PDE (un éditeur basé sur un formulaire pour les fichiers de configuration sous-jacents). Cliquez sur l'onglet Dépendances en bas et ajoutez votre plugin enfant à la liste "Plug-ins requis" dans la section de gauche du formulaire. Alternativement, vous pouvez ajouter le paquet com.myworkplace.child à la liste "Imported Package" sur la droite. La différence entre les deux est au-delà de la portée de cette réponse, mais vous pouvez lire à ce sujet dans les docs de l'éclipse maintenant que vous (espérons-le) allez dans la bonne direction.

+0

Ceci est correct. Si cela ne fonctionne pas, cliquez avec le bouton droit de la souris sur le projet dans le navigateur et sélectionnez l'option 'Mettre à jour le chemin de classe'. –

+0

À droite, parent est un plugin RCP.L'enfant n'est pas et n'a rien à voir avec RCP. Donc je ne peux pas l'ajouter via les plugins requis. Mystérieusement, il manque également dans la liste des paquets qui peuvent être importés. J'ai réussi à exécuter l'application sans erreurs par une méthode: exporter l'enfant comme un pot et l'ajouter sous l'onglet d'exécution des propriétés du plugin. Laid. Quoi qu'il en soit, c'est une réponse assez bonne pour être acceptée. – jsn

+1

@jsn Juste une recommandation amicale de quelque chose à considérer sans connaître les détails de votre situation: Vous devriez envisager de convertir le projet enfant en un plugin. La seule différence est l'ajout d'un fichier META-INF/manifest.mf (ou l'ajout de quelques entrées spécifiques à OSGi dans ce fichier si vous en avez déjà un). Le projet enfant sera toujours complètement utilisable en tant que fichier jar autonome (non-OSGi) à d'autres fins, et il permettra une intégration plus élégante avec l'application RCP parente. – ChrisH

0

Si votre code est en cours d'exécution sur un serveur d'applications, vous devez configurer le chemin de classe correctement pour ce serveur d'applications. Pour cela, recherchez l'onglet Serveurs, double-cliquez dessus, cliquez sur Ouvrir la configuration de lancement dans le nouvel onglet qui apparaît dans la zone d'édition principale, cliquez sur l'onglet Chemin de classe et vérifiez que le chemin de classe est correct.

+0

non il ne fonctionne pas sur le serveur d'applications – jsn

2

Nous avons constaté que même en faisant toutes les choses appropriées dans le projet eclipse rcp, nous recevions toujours de telles erreurs. La solution consistait à supprimer le répertoire d'espace de travail de l'application (par défaut, il stockait les paramètres de l'espace de travail sous .eclipse, mais nous avons modifié notre code pour utiliser un autre répertoire qui n'est pas partagé avec d'autres éclipses). Lorsque nous avons supprimé ce répertoire après une reconstruction, notre application a fonctionné. Apparemment, il stockait le classpath en même temps que d'autres paramètres, mais nous n'avons pas étudié les détails exacts. (NOTE: Ceci s'applique uniquement si vous avez appelé la méthode IWorkbenchConfigurer.setSaveAndRestore en transmettant une valeur booléenne de 'true' - ce qui signifie que votre application sauvegardera et restaurera divers paramètres rcp après un arrêt de l'application et une relance ultérieure

Questions connexes