vaso non caricato. Vedere le specifiche servlet 2.3, sezione 9.7.2. Classe offensiva: javax / servlet / Servlet.class


100

Sto gestendo un progetto Maven che è anche un progetto web dinamico. Ho usato tutte le librerie Spring in Maven. Ho creato web.xml, ma quando avvio il mio server Tomcat 7 ricevo il seguente messaggio:

INFO: validateJarFile(C:\Users\mibvzd0\workspace\.metadata\.plugins\
org.eclipse.wst.server.core\tmp2\wtpwebapps\hapi_hl7\WEB-INF\lib\
servlet-api-2.4.jar) - jar not loaded.
See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

Ho provato a eliminare il servlet da webapp/lib, ma non ha funzionato. Fammi sapere cosa dovrebbe essere fatto nel mio caso.


Notare che questo comportamento è conforme alla specifica del servlet. Una piena comprensione è utile per comprendere i problemi più complicati che potresti incontrare.
Thorbjørn Ravn Andersen

Risposte:


113

Il file .jar dell'API servlet non deve essere incorporato all'interno della webapp poiché, ovviamente, il container ha già queste classi nel suo classpath: implementa le interfacce contenute in questo jar.

La dipendenza dovrebbe essere providednell'ambito, piuttosto che compilenell'ambito predefinito , nel tuo Maven pom:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

"La dipendenza dovrebbe essere nell'ambito fornito, piuttosto che nell'ambito di compilazione predefinito, nel tuo Maven pom." Come posso farlo
dreambigcoder

Vedi la mia risposta modificata. pulire e creare l'app utilizzando Maven e verificare che il jar del servlet non si trovi nella directory WEB-INF / lib nella webapp generata.
JB Nizet

Ho fatto tutto. ma sto trovando il vaso nella directory WEB-INF / lib. Se rimuovo il file jar, ricevo il messaggio INFO: Avvio del motore servlet: Apache Tomcat / 7.0.12 C'è qualcosa che devo fare?
dreambigcoder

6
Forse hai una dipendenza che ha una dipendenza transitiva da un'altra versione del vaso servlet. Usa mvn dependency: tree per trovare la provenienza di questo vaso servlet e aggiungi un'esclusione.
JB Nizet

come faccio lo stesso per l'edera?
Dinesh Babu KG

21

Viene visualizzato questo messaggio di avviso quando il file jar api servlet è già stato caricato nel contenitore e si tenta di caricarlo di nuovo dalla libdirectory.

Le specifiche del servlet dicono che non ti è permesso avere servlet.jar nella tua libdirectory webapps .

  • Sbarazzarsi del messaggio di avviso semplicemente rimuovendolo servlet.jardalla libdirectory.
  • Se non trovi il jar nella libdirectory cerca il tuo percorso di build e rimuovi il jar.

C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\project\WEB-INF\lib

Se stai eseguendo un progetto maven, modifica la javax.servlet-apidipendenza in ambito providedin te pom.xml poiché il contenitore ha già fornito il vaso servlet in sé.


4

Per risolverlo, imposta l' ambito su fornito . Questo dice a Maven di utilizzare il codice servlet-api.jar solo per compilare e testare, ma NON includerlo nel file WAR. Il contenitore distribuito "fornirà" il servlet-api.jar in fase di esecuzione.

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>

2

Potresti trovare utile la seguente riga di comando di Windows per rintracciare il file jar incriminato. crea un indice di tutti i file di classe in tutti i vasi nella cartella. Esegui dalla cartella lib della tua app distribuita, quindi cerca nel file index.txt la classe incriminata.

for /r %X in (*.jar) do (echo %X & jar -tf %X) >> index.txt

2

Ambito di dipendenza Maven

condizione : Questo è molto simile in fase di compilazione, ma indica che si aspetta il JDK o un contenitore per fornire la dipendenza in fase di esecuzione. Ad esempio, durante la creazione di un'applicazione Web per Java Enterprise Edition, impostare la dipendenza dall'API Servlet e dalle API Java EE correlate all'ambito fornito perché il contenitore Web fornisce quelle classi . Questo ambito è disponibile solo nel classpath di compilazione e test e non è transitivo.


1

Ho lottato con questo problema e ho provato numerose "soluzioni".

Tuttavia, alla fine, l'unico che ha funzionato e ci sono voluti alcuni secondi per farlo è stato: eliminare e aggiungere di nuovo la nuova istanza del server !

Fondamentalmente, ho fatto clic con il pulsante destro del mouse sul mio server Tomcat in Eclipse in Server e l'ho eliminato. Successivamente, ho aggiunto un nuovo server Tomcat. Ho ripulito e ridistribuito l'applicazione e ho eliminato questo errore.


Fare clic con il pulsante destro del mouse sul server -> Pulisci ... e poi di nuovo fare clic con il pulsante destro del mouse sul server -> la directory di lavoro pulita di Tomcat l'ha risolta per me
kiltek

0

Controlla all'interno della seguente directory per il file jar el-api.jar: C: \ apache-tomcat-7.0.39 \ lib \ el-api.jar se esiste, quindi in questa directory della tua applicazione web WEB-INF \ lib \ el-api.jar il vaso dovrebbe essere rimosso


0

quando il pattern URL è sbagliato, potrebbe verificarsi questo errore.

per esempio. Se hai scritto @WebServlet ("login"), verrà mostrato questo errore. Quello corretto è @WebServlet ("/ login").


0

Le esclusioni e le provideddipendenze non funzioneranno nei progetti figlio.

Se si utilizza l'ereditarietà nei progetti Maven, è necessario includere questa configurazione nel pom.xmlfile padre . Avrai una <parent>...</parent>sezione nel tuo pom.xml se stai usando l'ereditarietà . Quindi avrai qualcosa del genere nel tuo genitore pom.xml:

<groupId>some.groupId</groupId>
<version>1.0</version>
<artifactId>someArtifactId</artifactId>
<packaging>pom</packaging>
<modules>
    <module>child-module-1</module>
    <module>child-module-2</module>
</modules>
<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

0

Manca la libreria delle dipendenze JAX-WS "jaxws-rt.jar".

Vai qui http://jax-ws.java.net/ . Scarica la distribuzione JAX-WS RI. Decomprimilo e copia "jaxws-rt.jar" nella cartella della libreria Tomcat "{$ TOMCAT} / lib". Riavvia Tomcat.


0

In genere, quando vedi questo messaggio, è benigno. Se dice

INFO: validateJarFile(/<webapp>/WEB-INF/lib/servlet-api-2.5.jar) - jar not loaded. 
See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

Significa che sta ignorando il tuo servlet-api-2.5.jar perché tomcat ha già una versione incorporata di quel jar, quindi non utilizzerà la tua. In genere questo non causa problemi.

Se invece dice WEB-INF/lib/my_jar.jar - jar not loaded...Offending class: javax/servlet/Servlet.class

quindi quello che puoi fare (nel mio caso, è un vaso ombreggiato) viene eseguito

$ mvn dipendenza: albero

e scopri di avere una dipendenza transitiva da "qualcosa" che dipende da un jar che è servlet-api o qualcosa di simile (es:) tomcat-servlet-api-9.0.0. Quindi aggiungi un'esclusione a quella al tuo pom, ex: (nel mio caso, tomcat, nel tuo caso, probabilmente quelli menzionati nelle altre risposte):

 <dependency>
    ...
    <exclusions>
      <exclusion>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-servlet</artifactId>
      </exclusion>
    </exclusions> 
</dependency>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.