Tomcat CLASSPATH de l'est différente de celle de Java, et il ne comprend pas “.” Comment puis-je le changer?
J'ai passé des heures à essayer de comprendre pourquoi j'ai été faire les java.lang.NoClassDefFoundError
, et j'ai trouvé la cause de Tomcat classpath.
J'ai utilisé le code ci-dessous pour voir ce que les variables de chemin d'accès tenir:
out.println("Classpath: '" + System.getProperty( "java.class.path" ) + "'" );
out.println("Ext dirs: '" + System.getProperty( "java.ext.dirs" ) + "'" );
out.println("Library path: '" + System.getProperty( "java.library.path" ) + "'" );
out.println("Path separator: '" + System.getProperty( "path.separator" ) + "'" );
Et la sortie est:
Classpath: ':/usr/local/tomcat/bin/bootstrap.jar' Ext dirs: '/usr/lib/jvm/java-6-sun-1.6.0.16/jre/lib/ext:/usr/java/packages/lib/ext' Chemin de la bibliothèque: '/usr/lib/jvm/java-6-sun-1.6.0.16/jre/lib/i386/server:/usr/lib/jvm/java-6-sun-1.6.0.16/jre/lib/i386:/usr/lib/jvm/java-6-sun-1.6.0.16/jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib' Séparateur de chemin: ':'
Comme vous pouvez le voir, le chemin de classe ne commence PAS par "." comme il est censé le faire, et je crois que c'est pourquoi mon programme ne peut pas trouver les classes que je l'importation de sous-répertoires dans ma webapp.
Pour voir où le classpath est réglé, je n'ai grep -R bootstrap.jar /usr/local/tomcat/
, et trouvé ceci: CLASSPATH="$CLASSPATH":"$CATALINA_HOME"/bin/bootstrap.jar
(dans le fichier /usr/local/tomcat/bin/catalina.sh
)
Ce qui me fait croire que, pour certaines raisons, $classe est vide ici. Cependant, echo $CLASSPATH
renvoie .:/usr/lib/jvm/java-6-sun/bin:/usr/local/tomcat/lib/servlet-api.jar
Quelqu'un peut-il aider à cerner le problème ici?
EDIT: Toutes mes servlet fichiers sont dans WEB-INF/classes/controllers/
, et les bibliothèques, je suis en train de charger, sont des fichiers de classe dans les sous-répertoires.
Par exemple, si ClassName.class
est dans le WEB-INF/classes/controllers/nom_du_paquet/répertoire, j'ai ajouter package packagename
le début de ClassName.java
, et je l'importer en utilisant import packagename.*
dans someServlet.java
.
EDIT2: j'ai résolu mon problème. Mon principal problème est que, comme écrit ci-dessous, en n'utilisant pas le bon paquet de noms. Aussi, j'ai essayé de compiler à partir de l'intérieur de la classes/controllers/
répertoire, au lieu de la compilation de classes/
. Merci à vous tous pour votre aide!
OriginalL'auteur Murat Ayfer | 2009-10-23
Vous devez vous connecter pour publier un commentaire.
Classes nécessaires, dans une application web doit être situé à l'intérieur de l'application web dans le WEB-INF/classes de dossier ou emballés dans des fichiers JAR situé dans WEB-INF/lib. Vous ne devriez normalement pas utiliser les conteneurs de servlet générique classpath paramètres pour cela, comme vous semblez le tenter.
Le bon package pour un fichier de classe situé dans WEB-INF/classes/controllers/packagename/ClassName.class serait "contrôleurs.packagename" et non pas "paquet" que votre question semble le laisser entendre. Vous ne pouvez pas avoir d'autres sous-répertoires sous WEB-INF/classes du chemin de classe, les racines et les propriétés du système ou les variables d'environnement sont dans une application web n'ont pas été évaluées par le chargeur de classe comme ils le sont dans une application autonome.
. serait probablement consulter le script de démarrage de tomcat, pas de la webapp.
OriginalL'auteur jarnbjo
Tomcat classpath n'est pas censé être en commençant par
.
. En fait, l'ajout.
au classpath est juste un moyen commode de dire à java pour rechercher des classes dans le répertoire courant sans avoir à utiliser-cp
lors de l'utilisation sur la ligne de commande.En fait, dans la plupart des cas, vous n'avez pas à ajuster Tomcat classpath. Pour faire Tomcat en mesure de trouver vos classes, ce que vous devez faire est de déployer votre application en tant qu'normalisé WAR (web archive) qui a une mise en page spécifique. Quelque chose comme ça:
La
WEB-INF/classes
répertoire est l'endroit où vos classes compilées besoin de l'être, c'est là que Tomcat va les chercher. Si vous placez vos classes dansWEB-INF/classes/controllers
,controllers
seront considérées comme faisant partie du nom de paquet (qui n'est probablement pas ce que vous voulez). Donc, vous avez deux options:controllers
répertoireMais ils sont mutuellement exclusifs, vous ne pouvez pas avoir les deux.
OriginalL'auteur Pascal Thivent
CLASSPATH
est pas "censé" pour commencer"."
. Puisque son but est de configuration de l'environnement d'exécution, il est libre de prendre n'importe quelle valeur que vous choisissez. Notez également que l'utilisation de laCLASSPATH
variable d'environnement a été découragé depuis Java 1.1 (publié au début de 1997)—au moins 12 ans.Le classpath d'une web-application, sur l'autre main est bien spécifié. Déplacer le contenu de la
controllers
répertoire (et les autres non valide sous-répertoires) dansWEB-INF/classes/
, de sorte que le répertoire du package est un enfant immédiat declasses
.OriginalL'auteur erickson