Domanda

Stiamo distribuzione di un file WAR in Tomcat 5.5 e funziona bene se WEB-INF \ classes contiene i file .classes, ma ci muoviamo se il file .jar che contiene che .classes in WEB-INF \ lib, otteniamo un fa eccezione il runtime lamentando che java.lang.NoSuchMethodError, ma file di classe esistente nel file .jar contiene la classe e il metodo fa uscite!

Qualsiasi aiuto su questo sarebbe apprezzato.

È stato utile?

Soluzione

Questo potrebbe essere causato a causa di un conflitto di classe. Assicurarsi che non ci sia una versione precedente della Classe da qualche parte (cartella condivisa di Tomcat, WEB-INF / classes, WEB-INF / lib). Se questo è il caso, in pratica non si può sapere quale classe Tomcat verrà caricato. Se si sceglie una senza il metodo, si verifica l'eccezione si verificano.

Altri suggerimenti

Dal momento che si stanno ottenendo un NoSuchMethodError, e non un ClassNotFoundError, significa che hai una vecchia versione della classe da qualche parte (al di fuori del file jar). Hai bisogno di trovare e rimuoverlo.

Questa è la classe defently closin si prega di dare un'occhiata qui http: //tomcat.apache.org/tomcat-5.5-doc/class-loader-howto.html#Class%20Loader%20Definitions

, come si può vedere non v'è una priorità più alta per le classi sotto WEB-INF / classes confronto WEB-INF / lib. Sono disponibili le due classi con lo stesso nome (e del pacchetto). Quando uno di loro è nelle classi cartella che ha la priorità più alta. quando entrambi sono nella cartella lib poi la seconda arrivare primo (vasi hanno una priorità in base al loro ordine alfa-betical)

Questo può spiegare la situazione.

Speranza che aiuta  - Yonatan

Dal punto di vista di un'applicazione web, di classe o di una risorsa di carico cerca nelle seguenti repository, in questo ordine:

le classi bootstrap del vostro JVM
Classi Classe loader di sistema (di cui sopra)
/ WEB-INF / classes della vostra applicazione web
/WEB-INF/lib/*.jar del vostro Web Application
classi caricatore di classe comune (sopra descritta)

Le posizioni ricercate dai "Common classe loader" sono definiti dalla struttura common.loader a $ CATALINA_BASE / conf / catalina.properties. Questo è dove ci consentono / definiamo percorso di condivisione;
shared.loader = $ {} catalina.base / shared / classi, $ {} catalina.base / shared / lib / *. jar

E l'ordine di cui sopra dà un quadro più chiaro per il problema che si deve affrontare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top