2010-01-05 8 views
0

Je suis en train de compiler la classe Servlet dans de Tomcat webappps/Courriel/src/dossier de courrier, mais je reçois des erreurs de compilation de temps:problème classpath

./Email/src/Mail/Mail.java:7: package javax.mail does not exist 

import javax.servlet.http.*; 

./Email/src/Mail/Mail.java:9:package javax.servlet does not exist 
import javax.servlet.*; 


./Email/src/Mail/Mail.java:12:cannot find symbol 
symbol: class HttpServlet 
public class mail extends HttpServlet{ 
         ^
./Email/src/Mail/Mail.java:14: cannot find symbol 
symbol: class HttpServletRequest 
location: class Mail.mail 
public void doPost(HttpServletRequest request,HttpServletResponse response) 
       ^

./Email/src/Mail/Mail.java:14: cannot find symbol 
symbol: class HttpServletRequest 
location: class Mail.mail 
public void doPost(HttpServletRequest request,HttpServletResponse response) 
              ^

./Email/src/Mail/Mail.java:20: cannot find symbol 
symbol: class MessageReading 
location: class Mail.mail 
      MessageReading mr=new MessageReading(); 

7 errors 

La commande que je suis à l'aide pour compiler la classe est:

C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps>javac -d ./Email/WEB-INF/classes -cp ./Email/src/Mail/. ./Email/src/Mail/mail.java 

est ici la classe servlet:

package Mail; 


import java.io.IOException; 
import java.io.PrintWriter; 
import java.util.Properties; 

import javax.servlet.http.*; 
import javax.servlet.*; 
import Mail.*; 

public class mail extends HttpServlet{ 

public void doPost(HttpServletRequest request,HttpServletResponse response) 
{ 

    try{ 


     MessageReading mr=new MessageReading(); 

     } 
    catch (Throwable e) { 
     System.out.println("Connection Failed! Check output console"); 
     e.printStackTrace(); 
     } 

    } 

} 

I t de la compilation correctement, quand je suis en train de le compiler en utilisant la commande:

C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps>javac -d ./Email/WEB-INF/classes ./Email/src/Mail/*.java 

La MessageReading et la classe de courrier dans le dossier Mail.

Quelqu'un peut-il s'il vous plaît me dire pourquoi la deuxième commande a travaillé pas le premier?

Répondre

1

La première version ignore la variable d'environnement CLASSPATH lorsque vous utilisez -cp pour définir explicitement le classpath. Le second ne le fait pas. J'imagine que votre CLASSPATH contient JavaMail, l'API de servlet etc. Tapez set classpath sur la ligne de commande pour vérifier cela.

1

La variable CLASSPATH d'environnement sera utilisée lorsque vous ne pas spécifier le classpath sur la ligne de commande avec -cp. Donc, en supposant que vos jars manquants sont dans votre variable CLASSPATH (servlet.jar, mail.jar, etc etc), étant donné que vous ne les spécifiez pas sur la ligne de commande, vous obtenez une erreur avec votre chemin de classe spécifié (incomplètement spécifié) vous tapez -cp. Si rien d'autre, il serait bon d'ajouter les jars requis à la ligne de commande pour aider à comprendre ce que votre programme doit exécuter. Après avoir ajouté servlet.jar et mail.jar, je crois que vous obtiendrez quelques erreurs supplémentaires pour les choses requises par mail.jar. Ceci est utile pour comprendre les dépendances.

+0

Ah oui - Steve B. a raison; votre variable CLASSPATH d'environnement est utilisée lorsque -cp n'est pas spécifié. Cependant, je recommande de laisser vide le CLASSPATH de votre machine, car cela peut entraîner des problèmes plus tard (travailler sur plusieurs projets) qui sont difficiles à déboguer ou à reproduire sur les machines de vos collègues. –

+1

Je veux réellement l'entête de classpath pour rechercher toutes les classes dans le dossier de courrier, comme MessageReading, sans spécifier son nom au moment de compiler la classe de courrier. Comment pourrais-je faire si ça ne marche pas? – Dusk

0

Une note avant ma réponse: la plupart des gens ne compilent pas de code Java en appelant directement javac. Pensez à utiliser Ant ou Maven2 avec votre projet.

Je ne comprends pas comment ou pourquoi la 2ème commande fonctionne, et je suis surpris si c'est le cas. Le code Java pour les API de référence de la classe 'mail' dans les packages externes non-JDK; vous devez fournir des informations de chemin de classe à javac (en utilisant l'option -cp) pour que le compilateur puisse "se connecter" avec ces bibliothèques.

Dans votre première commande, je me méfie du fait que l'argument -cp semble pointer vers les fichiers source; cette option doit pointer vers des répertoires contenant des fichiers de classe compilés et/ou des fichiers .jar contenant des fichiers de classe.

Les classes API JavaMail et les classes javax.servlet sont généralement contenues dans des fichiers .jar. Je suis sûr que Tomcat a au moins le pot de servlet, et vous pouvez télécharger JavaMail de java.sun.com.