Java-Servlet wird nicht kompiliert - javax.servlet kann nicht gefunden werden

Ich habe große Probleme beim Kompilieren von Java-Servlets. Soweit ich sehen kann, habe ich alles getan, was ich tun muss, ich installiere Tomcat 7 korrekt und Tomcat funktioniert. Wie ich verstehe, muss ich das servlet.jar-Paket meinem Klassenpfad hinzufügen. Es scheint kein Servlet.jar auf meinem System zu geben, aber von dem, was ich von den Tomcat-Dokumenten verstehe, ist es jetzt servlet-api.jar.

Ich habe dies getan, indem ich den Klassenpfad unter /etc/environment bearbeitet habe:

PATH = "/ usr/lokal/sbin:/usr/lokal/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" CLASSPATH = "/ usr/teilen/tomcat7/lib/servlet-api.jar"

Leider, immer noch kein Glück, ich kann Java-Servlets kompilieren, und ich bekomme immer noch Warnungen über fehlende Symbole für javax.servlets .

Ich benutze Ubuntu 11.10 x64. Irgendwelche Ideen?

1

3 Antworten

Ich habe dies getan, indem ich den Klassenpfad unter /etc/environment bearbeitet habe:

     

PATH = "/ usr/lokal/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" CLASSPATH = " /usr/share/tomcat7/lib/servlet-api.jar "

Das sieht gut aus. Der PATH ist jedoch für das spezielle Problem nicht relevant. Es ist in keiner Weise von Java verwendet worden. Es wird nur von der Betriebssystemplattform verwendet, um nach ausführbaren Dateien zu suchen. Der CLASSPATH ist ähnlich, wird aber nur von Java verwendet, um nach Klassen zu suchen, die während der Kompilierung und/oder der Laufzeit verwendet werden sollen.

Ihr Problem wird höchstwahrscheinlich verursacht, weil Sie das -cp - oder das -classpath -Argument des javac -Befehls verwendet haben. In diesem Fall wird die Umgebungsvariable CLASSPATH ignoriert (dies gilt übrigens auch für den java -Befehl, auch wenn -jar) -Argument wird verwendet).

Sie müssen den Klassenpfad angeben, indem Sie only entweder die CLASSPATH Umgebungsvariable oder den -cp oder -classpath Argument. Die allgemeine Empfehlung ist, die CLASSPATH -Umgebungsvariable überhaupt zu vergessen, da dies als eine schlechte Übung angesehen wird, wenn Sie etwas mehr als nur "Hello World" tun wollen. Sie können mehrere Pfade im -cp - oder -classpath -Argument angeben, indem Sie : verwenden.

$ cd /path/to/package/root/of/your/servlet/code
$ javac -cp .:/path/to/servlet-api.jar com/example/YourServlet.java

Wenn Sie es leid sind, dies jedes Mal zu wiederholen, legen Sie es einfach in ein .sh -Skript oder verwenden Sie ein Build-Tool wie Ant, das die Konfiguration durch eine XML-Datei erlaubt, oder verwenden Sie einfach eine IDE wie Eclipse. Netbeans oder IntelliJ, die automatisch alles tun, wenn Sie nur die Quelldatei speichern.

3
hinzugefügt

Sie sollten keine Umgebungsvariable CLASSPATH haben.

Ein besserer Weg, dies zu tun, ist das -classpath -Argument für javac.exe beim Kompilieren und java.exe beim Ausführen. Fügen Sie das Tomcat-Servlet-api.jar auf diese Weise hinzu.

Ein anderer Vorschlag ist Ant zu lernen. Es ist ein XML-basiertes, Java-basiertes Build-Tool. Es ist einfacher zu lernen und zu benutzen als Maven. Ich würde damit anfangen.

2
hinzugefügt

javax.servlets is defined in servlet-api.jar so your issue must be with your config somehow. What are you using to compile? Are you issuing javac commands directly or using a build tool like maven, or ant, or event eclipse? I would recommend maven because it handles dependencies for you with a single configuration file. Really easy to pick up too.

In maven müssen Sie zunächst maven installieren/konfigurieren und Ihr Projekt mit einer festgelegten Dateistruktur starten (dies ist zwar vereinfacht, aber ausreichend):

/src/main/java - The root of your java files
/src/main/webapp - The root of your webapp
/pom.xml - Maven configuration file

Eine vollständige Dateiliste für ein Servlet könnte also sein:

/src/main/java/com/mycompany/myapp/MyServlet.java
/src/main/webapp/WEB-INF/web.xml
/src/main/webapp/index.jsp
/pom.xml

Die ersten drei Zeilen (abgesehen von der Root-Dateistruktur) sind die gleichen wie für jede Web-App, die letzte ist Ihre Konfigurationsdatei, die wie folgt aussehen würde:


  4.0.0
  com.mycompany
  myapp
  0.0.1-SNAPSHOT
  war

  
    
      javax.servlet
      servlet-api
      2.5
      jar
      provided
    
  

Der wichtige Teil hier ist, dass die Abhängigkeit von Servlet-API von Maven gehandhabt wird, so dass es nicht notwendig ist, sie herunterzuladen oder Klassenpfade oder irgendetwas einzurichten. Sobald Sie diese Dateistruktur festgelegt und Ihren Pom bearbeitet haben, navigieren Sie einfach durch eine Konsole zum Stamm und geben mvn package ein. Das wird Ihre Abhängigkeiten herunterladen, Ihren Code kompilieren und Ihren Krieg verpacken. Es gibt eine Menge mehr, die Maven mit sehr minimalen Modifikationen bietet. Im Gegensatz dazu würde Ameisen dies erfordern:

hinzugefügt werden

2
hinzugefügt
"Maven" und "easy" gehören nicht in den gleichen Satz.
hinzugefügt der Autor duffymo, Quelle
Ich habe die Konvention nicht gemeistert. Vielleicht gibt es noch Hoffnung, aber Ant finde ich viel einfacher. Ich bin ein Spring-Benutzer, also sind die meisten meiner Abhängigkeiten für mich leicht verfügbar. Maven gibt mir mehr Kopfschmerzen als es heilt.
hinzugefügt der Autor duffymo, Quelle
Ich kenne den Unterschied zwischen Spring und Maven. Mein Punkt ist, dass wenn ich Spring herunterlade, ich alle abhängigen JARs in der korrekten Version bekomme. Wozu brauche ich Maven?
hinzugefügt der Autor duffymo, Quelle
Ich kann es einmal herunterladen und ich bin fertig. Es scheint mir einfacher zu sein, eine Version von Spring herunterzuladen, als Maven mit jeder Operation auszuhalten.
hinzugefügt der Autor duffymo, Quelle
Aber der Frühling kommt mit 99% der Abhängigkeiten, die ich brauche. Es sortiert mich ziemlich gut aus. Es ist wie sein eigenes Maven-Repository.
hinzugefügt der Autor duffymo, Quelle
Ich mag sie irgendwann, und sie schaden nicht, wenn sie auf meiner Festplatte sitzen. Ich pflücke, was ich will und lasse den Rest zurück. Immer noch einfacher als Maven.
hinzugefügt der Autor duffymo, Quelle
@duffymo Es ist einfach, wenn es sich um einfache Anwendungsfälle handelt, wie z. B. Vanilla-Apps, Standard-Repos, keine Berichte, usw. Früher, ja, manchmal ist es ein echter Schmerz.
hinzugefügt der Autor Dave Newton, Quelle
@duffymo Nicht alles kommt mit seinen eigenen Abhängigkeiten, noch ist es immer offensichtlich, welche spezifischen Abhängigkeiten tatsächlich benötigt werden. IMO ist es besser, in den meisten Fällen etwas anderes mit dem transitiven Abhängigkeitsmanagement umgehen zu lassen.
hinzugefügt der Autor Dave Newton, Quelle
@duffymo, ich habe sie beide ausgiebig benutzt. Ich finde Maven viel einfacher. Konvention über Konfiguration. Sobald Sie die sehr einfache Konvention bekommen, erhalten Sie eine ganze Menge kostenlos. Am wichtigsten ist die Abhängigkeitsverwaltung, die in dieser Situation besonders praktisch ist (was man tun kann, wenn man Efeu mit einbezieht, der nicht sehr leicht zu verstehen ist).
hinzugefügt der Autor Lucas, Quelle
@duffymo, Ich bin total ein Frühlingstyp, aber der Frühling macht Abhängigkeitsinjektion (Laufzeitkram), maven macht das Abhängigkeitsmanagement (stellt sicher, dass alle für die Kompilierung/Test/Laufzeit benötigten Dateien im Klassenpfad verfügbar sind). Zum Spaß werde ich versuchen, hier ein paar schnelle Beispiele hinzuzufügen ...
hinzugefügt der Autor Lucas, Quelle
@duffymo, Ah, ich verstehe. Es ist so lange her, dass ich eigentlich etwas heruntergeladen habe, also denke ich, das ist das, wofür ich sagen würde, dass Sie Maven brauchen. Kein Download nötig. Und das Ändern von Versionen ist so einfach wie das Ändern einer Zahl im Pom (an diesem Punkt würde es auch alle seine Abhängigkeiten aktualisieren). Außerdem würde es sicherstellen, dass andere Pakete, die Abhängigkeiten hatten, nicht in Konflikt mit den Abhängigkeiten standen, die der Frühling brachte. Maven-Abhängigkeitsverwaltung (oder sogar Ivy, wenn Sie dorthin gehen wollen) waren in meiner Erfahrung echte Lebensretter.
hinzugefügt der Autor Lucas, Quelle
@duffymo, das würde auch bedeuten, dass es mit vielen Dingen kommt, die man nicht braucht/braucht (es sei denn, man benutzt alles in jedem Projekt).
hinzugefügt der Autor Lucas, Quelle