2009-11-12 6 views
0

Contexte personnel rapide: J'ai été embauché il y a quelques mois comme unique développeur .NET (C#) par une société dont les autres développeurs sont tous des dev php. Une semaine après le début du travail, on m'a dit qu'ils voulaient passer à Java au lieu de faire .NET. Ce n'est pas une situation idéale, mais j'essaie de le faire fonctionner. Je ne pense pas comprendre la relation entre la bibliothèque d'un projet et le chemin de la classe. J'utilise NetBeans 6.7.1 pour le développement. Mon projet actuel consiste à créer une application qui mettra à jour plusieurs sources marchandes (eBay, Amazon, etc.). J'ai créé un projet de bibliothèque de classes qui gère la planification de ces mises à jour. Nous l'appellerons Update.Problèmes de bibliothèque Java et de chemin de classe

Je suis en train de créer des projets de bibliothèque de classes pour les diverses sources (par exemple eBay). J'ai ajouté le projet ebay au projet Update en tant que bibliothèque. Dans l'EDI, il y a une boîte qui dit "Build Projects on Classpath" qui est cochée.

Enfin, en ce moment j'ai une petite application de console qui a le projet de mise à jour référencé comme une bibliothèque (de sorte que le projet ebay est maintenant 2 bibliothèques profondes) de la même manière. Cela fonctionne avec le code dans le projet de mise à jour.

Cela fonctionne bien jusqu'à ce que j'instancie une classe (à partir du projet Mettre à jour via l'application console) qui se trouve dans le projet ebay. À ce moment-là, je reçois un

Exception in thread "main" 
java.lang.NoClassDefFoundError 

qui est

Caused by: java.lang.ClassNotFoundException 
    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) 

Ces projets se construit à cette fin, mais exception d'exécution me tue. Je ne sais pas si je comprends vraiment ce que fait une bibliothèque pour un projet et s'il y a quelque chose de plus à faire pour rendre la classe accessible. Je suis habitué à pouvoir ajouter une référence à une DLL et être bon à faire. Je ne comprends pas pourquoi je n'obtiens aucune erreur de compilateur ou d'erreur de compilation, mais je reçois des erreurs d'exécution à propos de l'accessibilité. Je suppose que le classpath est une pièce manquante que je ne comprends pas très bien, même si je suppose que c'est possible que ce problème ait à voir avec autre chose.

Répondre

1

La solution que je suis venu avec pour l'instant:

Je me attendais les références des bibliothèques imbriquées à « bouillonner ». Cela ne fonctionne apparemment pas pour les classes. Ma structure est essentiellement:

A a B référence à a référence à C

Quand je courais A il a bien fonctionné jusqu'à ce qu'il a quelque chose en C. Ce que je faisais était donner une référence directe à C en ajoutant comme une bibliothèque pour le projet. De quelques recherches rapides sur Google, il semble que ce soit à peu près comment vous ajoutez un chemin de classe à un projet dans NetBeans.

Cela me semble un peu compliqué et peut-être existe-t-il une meilleure façon de le faire, mais cela a réglé mes problèmes pour l'instant. Merci à tous ceux qui ont répondu - alors que personne n'a résolu précisément mon problème particulier (vous m'avez quand même obtenu 95% du chemin), ils ont vérifié mes pensées et m'ont permis de comprendre ce dernier petit bout pour le faire.

2

En Java, contrairement à C#, vous devez ajouter explicitement les chemins de classe à projeter. J'utilise eclipse et j'ai dû faire cela pour obtenir des jars référencés.

3

Je recommande fortement de prendre Core Java, volumes 1 et 2. Ils sont des lectures obligatoires pour les développeurs Java qui veulent comprendre les composants internes du langage tels que le ClassLoader. À tout le moins, lisez le chargement des classes.

Pour répondre à votre question, le projet Update devrait générer des fichiers .class ou jar. Vous devez avoir l'emplacement des fichiers de classe ou du fichier jar dans votre chemin de classe pour le projet auquel vous les référencez. En fonction de votre IDE, avoir une référence au projet peut vous donner accès à la source, pour la compilation.

3

Vous devez séparer les concepts Java des concepts spécifiques à l'EDI. Je recommande de passer par un tutoriel Java simple en utilisant un éditeur de texte et un shell de commande avant de sauter dans NetBeans. Bibliothèque et Projet sont des termes spécifiques à NetBeans. Je ne suis pas un utilisateur de NetBeans, donc je ne vais pas essayer de deviner ce qu'ils sont, même si j'ai quelques suppositions, mais je dirai que leur configuration affectera probablement l'environnement de compilation.

Un chemin de classe est un concept java de base. Vous devez fournir les chemins d'accès à toutes vos classes (ou jar qui contiennent ces classes) à la commande java lors de l'exécution afin qu'il soit en mesure de charger ces classes.(Vous devez également faire la même chose avec la commande javac au moment de la compilation pour les classes que vous référencez mais que vous ne compilez pas pour le moment).

Chaque fois que vous voyezjava.lang.ClassNotFoundException, cela signifie que certaines classe qui était présent sur le chemin de classe lorsque vous compilez votre code est absent de la classpath lorsque vous avez lancé l'exécution.

1
Exception in thread "main" 
java.lang.NoClassDefFoundError 

Le nom de classe est manquante dans le message d'erreur, mais supposons que c'est la classe elle-même pour laquelle vous voulez exécuter la méthode main. Dans ce cas, cela signifie simplement que Java ne peut pas trouver la classe particulière dans le classpath runtime.

Pour résoudre ce problème, vous devez cd à la racine du package où la classe se trouve et puis re-exécuter la commande java comme suit:

java -cp . com.example.MainClass 

Ici l'argument -cp spécifie le chemin de classe. Il a seulement une valeur de . ce qui signifie que le répertoire de travail courant devrait être pris dans le classpath (qui est habituellement le cas par défaut, mais mieux vaut prévenir que rien).

Sinon, vous pouvez spécifier le chemin complet dans l'argument -cp, de sorte que vous pouvez l'exécuter de partout, par exemple:

java -cp /path/to/package/root com.example.MainClass 

Une autre alternative qui est le plus vu dans les didacticiels pour commencer, mais est généralement pas été utilisée par les professionnels est de définir une variable d'environnement %CLASSPATH% dans lequel vous mettez exactement cette valeur ce que vous souhaitez utiliser dans l'argument -cp. Alors la commande java le recherchera (aussi longtemps que vous faites pas utilisez un des arguments -cp, -classpath ou -jar).

Si vous tapez des commandes longues, vous pouvez utiliser un fichier batch ou un fichier shell pour pouvoir les gérer facilement.

Si vous avez par exemple un fichier JAR ou un autre dossier de package racine avec des classes que vous souhaitez utiliser dans votre programme, vous devez les ajouter au classpath. Sous Windows, le séparateur est le point-virgule ; et sous Linux, le séparateur est :.Plus loin quand un chemin contient des espaces, vous devez citer le chemin particulier. Voici un exemple Windows:

java -cp .;/path/to/package/root;"/spacy path/to/file.jar" com.example.MainClass 

Espérons que cela aide.

+0

Merci pour la publication. Il s'est avéré que cela avait à voir avec les problèmes référentiels dans NetBeans (voir ma propre réponse à cette question). J'ai fait l'hypothèse (incorrecte) qu'un projet était autonome - que s'il avait toutes les références établies pour lui-même que tout ce qui utilisait ce projet pouvait simplement référencer le projet lui-même - sans avoir besoin de référencer toutes les pièces, le projet référencé était aussi en utilisant. –

Questions connexes