web-dev-qa-db-fra.com

CLASSPATH, Java Build Path (Eclipse) et WEB-INF \ LIB: quoi utiliser, quand et pourquoi?

Je suis récemment passé à J2EE à partir de .NET et je ne sais pas où placer les fichiers JAR. Je sais que le CLASSPATH, WEB-INF et le chemin Web Java d'Eclipse sont tous des endroits où les fichiers JAR peuvent être stockés, mais je ne sais pas quel dossier utiliser, quand et pourquoi.

Tout d'abord, nous avons le CLASSPATH. Je règle généralement cela en allant dans "Variables d'environnement" dans "Poste de travail". Je sais que c'est l'endroit par défaut où le compilateur Java recherche les fichiers JAR. Lorsque j'ajoute un dossier ou un JAR à ma variable d'environnement CLASSPATH, pourquoi est-il ignoré par Eclipse, le compilateur Java et le serveur Web?

De plus, je sais que WEB-INF\LIB est un endroit où vous pouvez placer des fichiers JAR que votre application Web va utiliser. Cependant, j'ai mis des fichiers JAR dans WEB-INF\LIB uniquement pour les ignorer. Dans quelles situations dois-je placer les fichiers JAR dans le dossier WEB-INF\LIB? Comment faire en sorte qu'Eclipse ou le serveur Web les remarque?

Jusqu'à présent, la seule chose qui fonctionne pour moi est de modifier réellement le Java Chemin de génération pour un projet Eclipse. Je vais sélectionner les fichiers JAR dont j'ai besoin et appuyer sur "Ajouter des fichiers JAR externes". La plupart du temps, lorsque je fais cela, Eclipse reconnaît mes fichiers JAR et y lit les classes. Cependant, j'ai rencontré un tas d'erreurs aléatoires étranges en faisant cela (principalement en ce qui concerne les dépendances, je pense). Pour une raison quelconque, j'ai juste l'impression que ce n'est pas la bonne façon de faire les choses et que je manque une information vitale. Quand dois-je ajouter manuellement des fichiers JAR externes dans Eclipse et quand dois-je faire les choses différemment? Comment se fait-il que le chemin de construction Java d'Eclipse ne semble pas connaître les dossiers de ma variable d'environnement CLASSPATH?

Vraiment, je voudrais juste mieux comprendre le CLASSPATH, le chemin de construction Java d'Eclipse et le dossier WEB-INF/LIB - les objectifs qu'ils servent, les relations entre eux et où je devrais mettre mes JAR dans diverses situations. J'apprécierais tout conseil que vous pourriez me donner, ou tout article que vous pourriez recommander.

Je vous remercie.

35
sangfroid

Le CLASSPATH que vous définissez dans votre environnement affecte uniquement les applications autonomes Java, c'est-à-dire celles que vous exécutez à partir d'une invite de commande ou d'une icône. Comme vous l'avez remarqué, Eclipse ignore cela. Il configure ses propres chemins de classe par projet.

javac et Java, s'ils sont appelés à partir de l'invite de commandes, devraient/peuvent honorer ce chemin, mais il n'est plus considéré comme une bonne pratique de le faire. Il s'est avéré que chaque application a besoin de son propre ensemble de choses, donc un CLASSPATH global ne fait vraiment aucun bien. La pratique moderne consiste simplement à spécifier le chemin de classe avec le -cp option sur la ligne de commande pour javac ou Java.

Un serveur d'applications Web autonome configurera également son propre chemin d'accès aux classes. À partir de la ligne de commande ou de l'interface graphique, les serveurs WebApp sont généralement démarrés par un script (.BAT ou .sh) qui configure un chemin de classe à l'aide de -cp. Tomcat possède un répertoire appelé common ou common/lib où il s'attend à voir les bibliothèques qui devraient être disponibles sur le serveur et tous les programmes qui s'exécutent sous lui. Mais vous n'aurez généralement pas besoin/ne voudrez pas jouer avec cela, car il est habituel pour les applications de fournir leurs propres collections de bibliothèque dans WEB-INF/lib.

Donc, pour une application Web, vous mettriez vos jarres varous dans le répertoire lib, sous WEB-INF, en supposant qu'Eclipse pré-construit une telle structure de répertoires pour vous.

Toutes les bibliothèques dont vous avez besoin doivent également être portées à la connaissance d'Eclipse. Dans l'Explorateur de projets, je sélectionne la totalité d'entre eux à la fois, cliquez avec le bouton droit et sélectionnez Build Path | add to build path. C'est plus facile que de jouer manuellement avec le chemin de construction du projet d'Eclipse.

31
Carl Smotricz

Java a une longue histoire et l'expérience a montré que certaines idées étaient bonnes et d'autres mauvaises.

La variable d'environnement CLASSPATH était le moyen initial de dire à la machine Java où localiser les classes de votre programme, et fonctionne raisonnablement bien pour les programmes en ligne de commande. Il a été rapidement constaté que cela ne devrait pas être un global chose (car cela a tendance à gâcher les choses à long terme) mais une chose par programme. Cela pourrait être fait en créant un script wrapper/fichier BAT qui définit la variable et exécute le Java = machine.

Tout allait bien, alors les gens voulaient écrire des choses de serveur Web en Java. L'API Servlet a été créée lorsqu'une application Web est une unité autonome - cela a entraîné le CLASSPATH pour chaque application Web est les fichiers décompressés sous WEB-INF/classes ainsi que les fichiers jar sous WEB-INF/lib. Et seulement ça. Cela signifie que la variable globale CLASSPATH est ignorée. Cela s'est avéré être une TRÈS bonne chose, donc le concept a migré ailleurs.

Par exemple, un "exécutable jar" (qu'Eclipse appelle un "exécutable jar") qui est invoqué avec "Java -jar foobar.jar" contient le chemin de classe complet À L'INTÉRIEUR du Jar dans un fichier manifeste spécial. Java Web Start qui est utilisé pour démarrer Java programmes à partir d'un serveur Web répertorie explicitement le chemin de classe complet dans le fichier de configuration sur le serveur).

Mais pour commencer. Si vous souhaitez écrire une application Web Java:

  1. Obtenez la version Eclipse Java EE.
  2. Créez un nouveau projet Web dynamique, par ex. nommé foobar.
  3. Faites glisser et déposez (ou copiez/collez) les fichiers jar dont vous avez besoin dans foobar/WebContent/WEB-INF/lib
  4. Créez un nouveau fichier nommé foobar/WebContent/index.jsp. Dans le type de fichier vide <h1>Hello World <%= new Java.util.Date() %></h1>
  5. Cliquez avec le bouton droit de la souris dans l'éditeur pour index.jsp, choisissez Exécuter -> Exécuter sur le serveur, puis choisissez Aperçu -> J2EE sur le serveur localhost, et Terminer.

Une fenêtre de navigateur va maintenant s'ouvrir, soit dans un navigateur, soit dans Eclipse, ce qui rendra votre page JSP. Vous pouvez changer la page JSP, l'enregistrer avec Ctrl-S et recharger la fenêtre du navigateur pour voir les changements.

11

De plus, je sais que WEB-INF\LIB est un endroit où vous pouvez placer des fichiers JAR que votre application Web va utiliser. Cependant, j'ai mis des fichiers JAR dans WEB-INF\LIB uniquement pour les ignorer. Dans quelles situations dois-je placer les fichiers JAR dans le dossier WEB-INF\LIB? Comment faire en sorte qu'Eclipse ou le serveur Web les remarque?

Le problème réel que vous avez ici est probablement que vous n'avez pas obtenu Eclipse pour Java EE développeurs et/ou que vous venez de créer un projet Java générique au lieu d'un Dynamic Web Projetez et créez vous-même la structure de dossiers nécessaire.

Si vous créez un projet Web dynamique dans Eclipse pour les développeurs Java EE , Eclipse ajoutera automatiquement toutes les bibliothèques dans WEB-INF/lib vers le chemin de génération . Le chemin de construction est approximativement dit simplement le chemin de classe qui a été utilisé à la fois en temps de compilation et en temps d'exécution. En d'autres termes: déposez simplement les JAR tiers là-dedans, il n'y a vraiment plus rien à faire.

Notez que Java est sensible à la casse, donc il devrait être vraiment appelé WEB-INF/lib, Pas WEB-INF/LIB. Mais de toute façon, si vous créez un projet Web dynamique , Eclipse va simplement générer automatiquement la structure de dossier/fichier qui vous convient.

Comme d'autres l'ont dit, ignorez la variable d'environnement %CLASSPATH%. Il est uniquement utilisé par javac.exe/Java.exe et même alors uniquement lorsque vous le faites not ​​spécifiez l'un des les arguments -cp, -classpath ou -jar. Dans le monde réel, cette variable d'environnement est rarement utilisée, c'est juste une commodité pour les débutants (et malheureusement aussi la plus déroutante, ils n'auraient jamais dû l'inventer).

4
BalusC

Si vous avez affaire à des applications Web,/WEB-INF/lib est l'endroit portable pour placer les fichiers JAR. C'est ici que serveurs web les conteneurs de servlets s'attendent à trouver les fichiers jar d'une application.

3
Powerlord

Je ne suis pas un expert Eclipse, mais je pense que votre problème peut être répondu comme ceci:

1) CLASSPATH est une variable d'environnement qui est lue lorsque vous lancez des programmes Java et qui est utilisée par le chargeur de classe pour déterminer où les classes sont placées.

Je modifierais la variable CLASSPATH uniquement dans le cas où vous lancez un programme Java à partir d'un script, car cela vous permet de lancer facilement un programme et de vous assurer que les classes sont trouvées. Ce serait ce ne sera pas le cas pour vous, car vous développez l'application web.

2) WEB-INF/lib est le répertoire dans lequel le chargeur de classe du conteneur d'application Web (comme Tomcat ou glassfish) examine si votre application Web doit résoudre une classe. Vous y mettez donc les classes utilisées dans votre application web.

Certains IDE incluent automatiquement les fichiers bibliothèques/.jar que vous utilisez dans un projet dans le package.

3) Résolution de la bibliothèque/chemin de classe Eclipse pendant le temps de développement. Je suppose, mais je m'excuse d'avoir supposé, comme on ne devrait vraiment pas le faire;), que vous pouvez définir une bibliothèque (ajouter des fichiers .jar externes aux projets) et la saisie semi-automatique/toutes les autres fonctionnalités intéressantes devraient commencer à fonctionner avec cela, comme vous rendez essentiellement ces classes visibles pour le IDE avec cette activité. Je suppose également que vous pouvez ensuite marquer ces bibliothèques pour qu'elles soient automatiquement ajoutées aux projets Web, etc., par l'IDE.

En général, une bonne lecture sur la façon dont les classes sont trouvées pendant l'exécution est ici (c'est la documentation officielle de Sun). La documentation de classe ClassLoader est également un bon endroit pour en savoir plus.

2
Laazik

Ensemble, les commentaires m'ont également aidé. J'avais ajouté tous les jena .jars au chemin de construction d'Eclipse mais ce n'était pas suffisant. Suite à la suggestion "d'ajouter à WEB-INF/lib", il semblait intuitif de faire glisser le dossier des bibliothèques vers WEB-INF (depuis Eclipse), mais cela n'a pas fonctionné. La copie des fichiers .jars vers WEB-INF n'a pas été effectuée non plus. J'ai finalement glissé-déposé du bureau Windows vers le dossier lib WEB-INF dans Eclipse, et cela a résolu le problème. Ce serait bien si des fichiers .jars ajoutés au chemin de génération étaient automatiquement copiés dans la librairie WEB-INF par Eclipse. Au cas où cela importerait, c'était Eclipse EE IDE, version Indigo, sur Windows 7.

2
Michael

Eclipse vous oblige à spécifier le chemin d'accès à vos bibliothèques, fichiers jar (sur Propriétés -> Java Chemin de génération -> onglet Bibliothèques). Celui-ci se trouve dans le fichier de projet .classpath.

Habituellement, vous avez les bibliothèques JRE sur son chemin (qui serait également sur votre chemin de classe), donc l'ajout des bibliothèques au chemin de classe et la mise à jour du chemin de génération Eclipse fonctionneraient.

Le répertoire WEB-INF doit être l'endroit qui contient les informations nécessaires à votre application Web.

2
Diego Dias