2016-01-22 41 views
9

Sto affrontando un problema durante la distribuzione di un servizio in Tomcat 8. Operazioni seguente errore:Operazioni NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()

Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String; at org.apache.tomcat.websocket.server.WsServerContainer.(WsServerContainer.java:149) at org.apache.tomcat.websocket.server.WsSci.init(WsSci.java:131) at org.apache.tomcat.websocket.server.WsSci.onStartup(WsSci.java:47) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5244) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 10 more

Metodo getVirtualServerName è stato introdotto nel Servlet 3.1 e dopo l'estrazione MANIFEST.MF dal mio servlet-api vaso ho avuto seguenti dati:

Specification-Title: Java API for Servlets 
Specification-Version: 3.1 
Specification-Vendor: Sun Microsystems, Inc. 
Implementation-Title: javax.servlet 

che dice che la sua avendo 3.1. Quindi c'è qualche altra ragione per questo errore? Please help

+0

corri da eclissi? oppure ... per favore fateci sapere di più sul vostro ambiente, applicazione e impostazioni. – MrSimpleMind

+0

Usi sicuramente Tomcat 8? Il tuo post è taggato 'tomcat7' ... –

+0

@AndrewRegan Scusa è stato un errore. Ho modificato Sto usando Tomcat 8 – Rehman

risposta

8

Controlla tutte le tue dipendenze Maven (o equivalenti) e assicurati che tu - o molto probabilmente un'altra dipendenza - non stia tirando una versione precedente alla 3.1 dello javax.servlet/servlet-api che potrebbe avere la precedenza su ciò che c'è nel tuo Tomcat 8 Se hai distribuito manualmente, assicurati di non aver copiato manualmente alcun JAR servlet-api in Tomcat stesso.

See: https://stackoverflow.com/a/26232535/954442

+0

Individuare la dipendenza offendente che sta introducendo il vaso API-servlet in Maven con il comando mvn dependency: tree dalla riga di comando nella root del progetto, cercare l'output per il servlet-api è più probabile 2.? versione, escludilo dalla dipendenza con il seguente nel tuo pom. { servlet-api javax.servlet } – user1412523

2

avvio primavera verrà eseguito Tomcat 7 per impostazione predefinita, è necessario eseguire l'override Maven tomcat.version accumulo nel vostro pom.xml. Vedi sotto per eseguire Tomcat 8.0.30

<properties> 
    <tomcat.version>8.0.30</tomcat.version> 
</properties> 

dovrebbe risolvere il problema.

2

Risolto Sul mio Mac con java 8 è stato affrontato il problema con il tomcat scaricato dal sito e decomprimere.

Il mio problema è stato risolto perché c'era un file servlet-api.jar in più che veniva prelevato. Veniva da /Library/Java/Extensions/servlet-api.jar

Per trovarlo nel vostro sistema è possibile utilizzare sudo find/-name servlet-api.jar

rimosso eseguendo copie di backup su da qualche altra parte.

stavo seguendo questo per intallation https://gist.github.com/ddanailov-nmdp/c97aba2ca926b9627f6b4f7174083a32

3

ho avuto questo errore sul IntelliJ con Maven dopo l'aggiornamento IntelliJ.

Potrei eseguire i test con Maven ma non con il mio IDE.

Ho risolto il problema rimuovendo i file ./idea e project.iml e ricaricando il progetto.

-1

Questo sicuramente ha qualcosa a che fare con la versione di javax.servlet e la versione di Tomcat.

Nel mio caso, è andato via quando ho dichiarato la dipendenza javax.servlet in gradle senza versione. Ti piace questa -

compile('javax.servlet:servlet-api') 
2

il metodo getVirtualServerName è stato aggiunto in ServletContext in Servlet 3.1.Trovare il metodo del documento java getVirtualServerName

questo problema può avere almeno 3 cause:

  1. la versione servlet è più vecchia che 3.1.

  2. altro jar ha la versione precedente della servlet di 3.1.

  3. la versione di Tomcat è più vecchio di 8

per risolverlo, si può provare la via di seguito.

I. per controllare il tuo pom.xml se ci sono i seguenti codici.

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

se il tuo pom.xml ha il codice sopra riportato, avrebbe ancora quel problema. puoi fare la seconda strada.

II. per controllare il tuo altro barattolo fai riferimento al barattolo javax.servlet-api. ad esempio, lo org.apache.santuario fa riferimento al vaso javax.servlet-api. il pom.xml:

<dependency> 
    <groupId>org.apache.santuario</groupId> 
    <artifactId>xmlsec</artifactId> 
    <version>1.4.3</version> 
</dependency> 

ma quando si guardano le dipendenze Maven, che si riferiscono al barattolo javax.servlet-api cui versione è 2.3 più vecchio di 3.1.

enter image description here

così si dovrebbe escludere la versione 2.3. pom.xml:

<!-- exclude servlet-api 2.3 jar--> 
<dependency> 
    <groupId>org.apache.santuario</groupId> 
    <artifactId>xmlsec</artifactId> 
    <version>1.4.3</version> 
    <exclusions> 
     <exclusion> 
      <groupId>javax.servlet</groupId> 
      <artifactId>servlet-api</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

<!-- servlet-api 3.1 version has getVirtualServerName() --> 
<dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>javax.servlet-api</artifactId> 
    <version>3.1.0</version> 
</dependency> 

III. spring boot esegui il tomcat predefinito 7. quindi definisci il tuo tomcat versione 8 invece di tomcat 7. quindi aggiungi il codice tuo pom.xml:

<properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
     <java.version>1.8</java.version> 
     <tomcat.version>8.5.5</tomcat.version> 
    </properties>