Java-servlet compileert niet - kan javax.servlet niet vinden

Ik heb grote problemen met het compileren van Java Servlets. Voor zover ik kan zien, heb ik alles gedaan wat ik moet doen, zoals geïnstalleerd tomcat 7 correct en tomcat werkt. Zoals ik begrijp, moet ik servlet.jar-pakket toevoegen aan mijn klassenpad. Er lijkt geen servlet.jar op mijn systeem te staan, maar van wat ik kan begrijpen van de tomcat-documenten, het is nu servlet-api.jar.

Ik heb dit gedaan door het klassenpad bij /etc/environment aan te passen:

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

Helaas, nog steeds geen geluk, ik kan Java-servlets niet compileren en ik krijg nog steeds waarschuwingen over ontbrekende symbolen voor javax.servlets .

Ik gebruik ubuntu 11,10 x64. Om het even welke ideeën?

1

3 antwoord

Ik heb dit gedaan door het klassenpad bij /etc/environment aan te passen:

     

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

Dat ziet er goed uit. De PATH is echter niet relevant voor het specifieke probleem. Het is op geen enkele manier door Java gebruikt. Het wordt alleen gebruikt door het besturingssysteemplatform om te zoeken naar executabeles. De CLASSPATH is vergelijkbaar, maar wordt alleen door Java gebruikt om te zoeken naar klassen die tijdens het compileren en/of runtime moeten worden gebruikt.

Uw probleem is waarschijnlijk veroorzaakt omdat u het argument -cp of -klassepad van de opdracht javac heeft gebruikt. In dat geval wordt de omgevingsvariabele CLASSPATH genegeerd (dit geldt trouwens ook voor de opdracht java , ook als -jar argument wordt gebruikt).

U moet het klassenpad opgeven met alleen ofwel de CLASSPATH omgevingsvariabele of de -cp of -klassepad -argument. De algemene aanbeveling is om de omgevingsvariabele CLASSPATH helemaal te vergeten, omdat dat een slechte oefening is wanneer je iets meer wilt doen dan alleen maar "Hallo Wereld". U kunt meerdere paden opgeven in het argument -cp of -klassepad met behulp van : .

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

Als je moe bent van het herhalen van dit elke keer typen, zet het dan gewoon in een .sh script, of gebruik een build-tool zoals Ant die configuratie door een XML-bestand toestaat, of gebruik gewoon een IDE zoals Eclipse, Netbeans of IntelliJ die het allemaal automagisch doen als je het bronbestand opslaat.

3
toegevoegd

U zou geen omgevingsvariabele CLASSPATH moeten hebben.

Een betere manier om dit te doen is om het -klassepad -argument te gebruiken voor javac.exe wanneer u compileert en java.exe wanneer u het uitvoert. Voeg op die manier de Tomcat servlet-api.jar toe.

Een andere suggestie is om Ant te leren kennen. Het is een XML-gestuurde, op Java gebaseerde build-tool. Het is gemakkelijker om te leren en te gebruiken dan Maven. Ik zou daarmee beginnen.

2
toegevoegd

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 moet u beginnen met het installeren/configureren van maven en uw project starten met een vaste bestandsstructuur (dit is vereenvoudigd, maar voldoende):

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

Dus een volledige bestandslijst voor een servlet kan zijn:

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

De eerste drie regels (behalve de structuur van het rootbestand) zijn hetzelfde als voor elke webapp, het laatste is uw configuratiebestand dat er als volgt uitziet:


  4.0.0
  com.mycompany
  myapp
  0.0.1-SNAPSHOT
  war

  
    
      javax.servlet
      servlet-api
      2.5
      jar
      provided
    
  

Het belangrijke deel hier is dat de afhankelijkheid van servlet-api wordt afgehandeld door maven, dus het is niet nodig om het te downloaden of klassenpaden op te zetten of zoiets. Zodra je deze bestandsstructuur hebt ingesteld en je pom hebt bewerkt, navigeer je gewoon naar een console naar de root en typ je mvn-pakket . Dat zal uw afhankelijkheden downloaden, uw code compileren en uw oorlog verpakken. Er is VEEL meer dat maven biedt met zeer minimale aanpassingen. Mier daarentegen zou dit vereisen:

wordt toegevoegd

2
toegevoegd
"Maven" en "eenvoudig" horen niet in dezelfde zin.
toegevoegd de auteur duffymo, de bron
Ik heb de conventie niet onder de knie. Misschien is er nog steeds hoop voor, maar ik vind dat Ant veel eenvoudiger is. Ik ben een Spring-gebruiker, dus de meeste van mijn afhankelijkheden zijn gemakkelijk beschikbaar voor mij. Maven geeft me meer hoofdpijn dan dat het geneest.
toegevoegd de auteur duffymo, de bron
Ik ken het verschil tussen Spring en Maven. Mijn punt is dat wanneer ik Spring download, ik alle afhankelijke JAR's bij de juiste versie krijg. Waarvoor heb ik Maven nodig?
toegevoegd de auteur duffymo, de bron
Ik kan een keer downloaden en ik ben helemaal klaar. Het lijkt mij gemakkelijker om een ​​versie van Spring te downloaden in plaats van Maven bij elke operatie te verdragen.
toegevoegd de auteur duffymo, de bron
Maar de lente komt met 99% van de afhankelijkheden die ik nodig heb. Het sorteert me redelijk goed. Het is net als zijn eigen Maven-repository.
toegevoegd de auteur duffymo, de bron
Ik wil ze misschien een keer, en ze doen er geen kwaad om op mijn harde schijf te zitten. Ik kies voor wat ik wil en laat de rest achter. Nog makkelijker dan Maven.
toegevoegd de auteur duffymo, de bron
@duffymo Het is gemakkelijk als het simpele use-cases zijn, zoals vanille-apps, standaard repo's, geen rapportage, enzovoort. Voorbij, ja, het wordt soms een echte pijn.
toegevoegd de auteur Dave Newton, de bron
@duffymo Niet alles heeft zijn eigen afhankelijkheden en het is ook altijd duidelijk welke specifieke afhankelijkheden eigenlijk vereist zijn. IMO Het is beter om in de meeste gevallen iets anders te laten omgaan met transitief afhankelijkheidsbeheer.
toegevoegd de auteur Dave Newton, de bron
@ Duffymo, ik heb em beide uitgebreid gebruikt. Ik vind dat maven veel eenvoudiger is. Conventie over configuratie. Zodra u de zeer eenvoudige conventie krijgt, krijgt u een heleboel gratis. Het belangrijkste is het afhankelijkheidsmanagement dat met name handig is in deze situatie (wat een mier kan doen als je klimop meeneemt die niet erg gemakkelijk te begrijpen is).
toegevoegd de auteur Lucas, de bron
@duffymo, ik ben helemaal een springer, maar lente injecteert afhankelijkheid (runtime stuff), maven doet afhankelijkheidsbeheer (zorgt ervoor dat alle potten die nodig zijn voor compileren/testen/runtime beschikbaar zijn in het klassenpad). Voor de lol zal ik hier een paar snelle voorbeelden toevoegen ...
toegevoegd de auteur Lucas, de bron
@ Duffymo, Ah, ik begrijp het. Het is zo lang geleden dat ik eigenlijk alles heb gedownload, dus ik denk dat dat is wat ik zou zeggen dat je maven nodig hebt. Niet nodig om te downloaden. En het veranderen van versies is net zo eenvoudig als het veranderen van een nummer in de pom (op dat moment zou het ook al zijn afhankelijkheden bijwerken). Het zou er ook voor zorgen dat andere pakketten met afhankelijkheden niet in strijd waren met de afhankelijkheden die de lente met zich meebracht. Mavenafhankelijkheidsbeheer (of zelfs Ivy als je daarheen wilt gaan) zijn volgens mijn ervaring echte spaarders.
toegevoegd de auteur Lucas, de bron
@duffymo, dat zou ook impliceren dat het met veel dingen komt die je niet nodig hebt/wilt (tenzij je alles in elk project gebruikt).
toegevoegd de auteur Lucas, de bron