Servletul Java nu va compila - nu poate găsi javax.servlet

Am probleme mari cu compilarea servletelor java. În măsura în care pot vedea, am făcut tot ce trebuie să fac, ive instalat tomcat 7 corect, și tomcat este de lucru. După cum am înțeles, trebuie să adaug pachetul servlet.jar la clasa mea de cursă. Nu pare sa fie un servlet.jar pe sistemul meu, dar din ceea ce pot intelege de la docs de tomcat, servlet-api.jar acum.

Am făcut acest lucru, prin editarea cursului de clasă la /etc/environment :

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

Din păcate, încă nu am noroc, nu pot compila servle java și im primesc avertismente despre simbolurile lipsă pentru javax.servlets .

Im folosind ubuntu 11.10 x64. Vreo idee?

1

3 răspunsuri

Am făcut acest lucru, editând calea de clasă la /etc/environment :

     

/usr/share/tomcat7/lib/servlet-api.jar "

Arată bine. Codul PATH este irelevant pentru problema particulară. Nu a fost folosit de Java în nici un fel. Este folosit numai de platforma sistemului de operare pentru a căuta executabeles. Codul CLASSPATH este similar, dar este folosit numai de Java pentru a căuta clase care vor fi folosite în timpul compilării și/sau a runtime-ului.

Problema dvs. este cel mai probabil cauzată deoarece ați folosit -cp sau -classpath argumentul comenzii javac . În acest caz, variabila de mediu CLASSPATH va fi ignorată (aceasta se aplică și comenzii java ), de asemenea, când ).

Trebuie să specificați calea de clasă numai de fie variabila de mediu CLASSPATH sau cod> sau -classpath . Recomandarea generală este să uitați de variabila de mediu CLASSPATH , deoarece aceasta este considerată o practică proastă ori de câte ori doriți să faceți ceva mai mult decât "Hello World". Puteți specifica mai multe căi în argumentul -cp sau -classpath folosind : .

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

Dacă te-ai săturat să repetați acest lucru de fiecare dată, puneți-l într-un script .sh sau utilizați un instrument de construcție, cum ar fi Ant, care permite configurarea printr-un fișier xml sau folosiți doar un IDE ca Eclipse, Netbeans sau IntelliJ, care o vor face automat când salvați fișierul sursă.

3
adăugat

Nu ar trebui să aveți o variabilă de mediu CLASSPATH.

O mai bună metodă este să folosiți argumentul -classpath la javac.exe atunci când compilați și java.exe atunci când executați. Adăugați Tomcat servlet-api.jar în acest fel.

O altă sugestie este să înveți Ant. Este un instrument bazat pe XML, bazat pe Java. Este mai ușor de învățat și de folosit decât Maven. Aș începe cu asta.

2
adăugat

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.

În maven, va trebui să începeți prin instalarea/configurarea maven și să începeți proiectul cu o structură de fișier setată (aceasta este simplificată, dar suficientă):

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

Deci, o listă completă de fișiere pentru un servlet ar putea fi:

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

Primele 3 linii (altele decât structura fișierului rădăcină) sunt aceleași ca și cele pentru orice aplicație web, ultimul este fișierul config care ar arăta astfel:


  4.0.0
  com.mycompany
  myapp
  0.0.1-SNAPSHOT
  war

  
    
      javax.servlet
      servlet-api
      2.5
      jar
      provided
    
  

Partea importantă aici este că dependența de servlet-api este tratată de maven, deci nu este nevoie să o descărcați sau să configurați cursuri de clasă sau altceva. După ce ați setat această structură de fișier și ați editat pomul dvs., purtați doar o consolă la root și tastați pachetul mvn . Aceasta vă va descărca dependențele, va compila codul și vă va împacheta războiul. Există o mulțime mai mult ca maven oferă cu modificări foarte mici. Dimpotrivă, furnica ar necesita acest lucru:

pentru a fi adăugat

2
adăugat
"Maven" și "ușor" nu aparțin aceleiași propoziții.
adăugat autor duffymo, sursa
Nu am stăpânit convenția. Poate că există încă speranță pentru asta, dar cred că Ant este mult mai ușor. Sunt utilizator de primăvară, deci majoritatea dependențelor mele sunt ușor accesibile. Maven îmi dă mai multe dureri de cap decât vindecă.
adăugat autor duffymo, sursa
Știu diferența dintre primăvară și Maven. Ideea mea este că atunci când descarc Spring, obțin toate JAR-urile dependente la versiunea corectă. De ce am nevoie de Maven?
adăugat autor duffymo, sursa
Pot descărca o dată și sunt pregătit. Mi se pare mai ușor să descarcăm o versiune de primăvară decât să supraviețuiască lui Maven cu fiecare operație.
adăugat autor duffymo, sursa
Dar primavara vine cu 99% din dependentele de care am nevoie. Mă descurcă destul de bine. E ca și propriul depozit Maven.
adăugat autor duffymo, sursa
S-ar putea să le vreau uneori și nu fac nici un rău pe hard disk-ul meu. Eu cireș alege ceea ce vreau și lasă restul în urmă. Încă mai ușor decât Maven.
adăugat autor duffymo, sursa
@duffymo Este ușor atunci când este vorba de simple cazuri de utilizare, cum ar fi aplicațiile vanilie, repo-urile implicite, nicio raportare etc. Peste asta, da, se transformă uneori într-o adevărată durere.
adăugat autor Dave Newton, sursa
@duffymo Nu totul vine cu dependențe proprii, și nici nu este întotdeauna evident care sunt dependențele specifice necesare de fapt . IMO este mai bine să permiteți altceva să se ocupe de gestionarea dependenței tranzitorii în majoritatea cazurilor.
adăugat autor Dave Newton, sursa
@ duffymo, le-am folosit pe amândouă, pe larg. Mi se pare maven să fie mult mai simplu. Convenția asupra configurației. Odată ce obțineți convenția foarte simplă, veți obține o mulțime gratuită. Cel mai important este gestionarea dependenței, care este deosebit de utilă în această situație (care poate fi făcută dacă includeți iedera care nu este foarte ușor de înțeles).
adăugat autor Lucas, sursa
@duffymo, Im total un tip de primăvară, dar primăvara nu are injecție de dependență (chestii runtime), maven are managementul dependenței (asigură toate borcanele necesare pentru compilație/test/runtime sunt disponibile pe classpath). Pentru distracție, voi încerca să adaug câteva exemple rapide aici ...
adăugat autor Lucas, sursa
@duffymo, Ah, văd. A fost atât de mult timp de când am descărcat ceva, deci cred că este ceea ce aș spune că aveți nevoie de Maven. Nu este nevoie să descărcați. Și schimbarea versiunilor este la fel de ușoară ca schimbarea unui număr în pom (în acest moment, el ar actualiza toate dependențele sale, de asemenea). De asemenea, s-ar asigura că alte pachete care au avut dependență nu s-au contrazis cu dependențele primite de primăvară. Gestionarea dependenței de Maven (sau chiar Ivy dacă vrei să mergi acolo) au fost adevărați salvatori de viață din experiența mea.
adăugat autor Lucas, sursa
@duffymo, care ar implica, de asemenea, că vine cu o mulțime de lucruri pe care nu aveți nevoie/doriți (cu excepția cazului în care folosiți totul în fiecare proiect).
adăugat autor Lucas, sursa