java.lang.NoSuchMethodError lorsque la méthode existe certainement
J'ai un Ressort de framework d'application web Java, qui a été construit en SpringSource Tool Suite ("STS"), et une copie locale de Apache Tomcat. Nous avons également une interne d'un serveur de production, de nouveau l'exécution de Tomcat.
Quand je lance l'application sur ma machine de développement, et de mener une action spécifique dans l'application web, tout fonctionne correctement. Cependant, quand j'déployer l'application web Tomcat sur le serveur (via un fichier war produite par maven), et répéter ces actions spécifiques, je me suis présenté avec certains comportements inattendus. Quand j'ai vérifié le serveur tomcat fichier journal, j'ai trouvé ce...
2011-11-16 19:36:45,090 [http-8280-Processor1] ERROR [attachments] invoke - Servlet.service() for servlet attachments threw exception java.lang.NoSuchMethodError: net.wmfs.coalesce.aa.dao.MediaDao.updateAlfrescoNodeRef(Ljava/lang/Long;Ljava/lang/String;)V
at net.wmfs.coalesce.aa.service.impl.MediaServiceImpl.doFileUpload(MediaServiceImpl.java:102)
at net.wmfs.coalesce.aa.servlet.MediaServlet.doFileUpload(MediaServlet.java:83)
at net.wmfs.coalesce.aa.servlet.MediaServlet.doPost(MediaServlet.java:55)
Maintenant, le updateAlfrescoNodeRef méthode electrique existe dans le MediaDao classe sinon mon code ne compile pas en STS...
package net.wmfs.coalesce.aa.dao;
public class MediaDao extends JdbcDaoSupport {
public void updateAlfrescoNodeRef(final Long recordId, final String nodeRef) {
//java code
}
}
Comme vous pouvez le voir, la signature de la méthode est correcte.
Je soupçonne qu'il peut y avoir eu un problème lors de maven produit de la guerre de fichier, j'ai donc extrait les fichiers war de contenu. Dans le WEB-INF/lib du dossier, j'ai trouvé le fichier jar qui contient l'MediaDao classe, et des extraits de son contenu. J'ai ensuite fait une...
cat ./MediaDao.class
Maintenant, que les fichiers de classe sont des fichiers binaires, j'ai surtout vu gobledegook. Cependant, j'ai été en mesure de faire des références à la updateAlfrescoNodeRef méthode, ainsi que le contenu d'une Chaîne de caractères dans la méthode. Donc, cela signifie que la méthode est bien là.
La fève de configuration dans le cadre du Printemps des fichiers XML est certainement correct, ou le code ne s'exécute pas lorsque je l'execute sur ma machine de développement.
Googler suggéré une bibliothèque conflit sur le serveur, mais tous référencés classes - MediaServlet, MediaServiceImpl, MediaDao - sont dans le projet principal (celui avec le dossier WEB-INF). Alors que son concevable il peut y avoir plusieurs copies de l'dépendances sur le serveur, il ya certainement une seule copie de l'objectif principal du projet bocal.
Quelqu'un a une idée pourquoi ce qui se passe?
javap -classpath <your-jar-file> net.wmfs.coalesce.aa.dao.MediaDao
et il doit énumérer les signatures de méthode. docscomparer la taille et la date de cette classe (MediaBlablahblah.class) sur l'ordinateur du développeur et sur le serveur
pertinentes javap de sortie suit... Compilées à partir de "MediaDao.java public" la classe net.wmfs.fusionnent.aa.dao.MediaDao s'étend org.springframework.jdbc.de base.de soutien.JdbcDaoSupport{ public void updateAlfrescoNodeRef(java.lang.Long, java.lang.String); }
pouvez-vous partager votre code qui renvoie à cette ligne:
MediaServiceImpl.doFileUpload(MediaServiceImpl.java:102)
. Aussi la déclaration de MediaDao
, si elle est MediaDao mediaDao
ou JdbcDaoSupport MediaDao
?J'ai téléchargé l'outil que vous avez mentionné et décompilé le MediaDao.class les fichiers produits par les STS et maven. Ils ont tous les deux la
public void updateAlfrescoNodeRef(Long recordId, String nodeRef)
méthode. Merci pour vos efforts Kowser.
OriginalL'auteur Jazz | 2011-11-17
Vous devez vous connecter pour publier un commentaire.
Le problème a été résolu. Merci à vous tous pour votre aide.
Il s'avère que le projet principal a une dépendance qui avait une autre
MediaDao
classe, dans exactement le même chemin d'accès au package. Quelqu'un avait copié la classe dans cette dépendance (comme une bibliothèque de ressources, de sorte que beaucoup de projets ne pourraient l'utiliser sans en préciser le projet principal en tant que dépendance). Cependant, que quelqu'un n'avait pas supprimé la classe dans le projet principal.Donc, quand j'ai modifié la classe dans le projet principal (j'ai ajouté le
updateAlfrescoNodeRef
méthode), et a couru la demande en STS sur ma machine, Tomcat utilisé la version de la classe dans le projet principal, et non pas dans la bibliothèque parce que le projet de bibliothèque a été fermée. Lorsque l'application a été déployée sur le serveur cependant, il semble que la version de la classe de la bibliothèque a été utilisé à la place (ce qui, évidemment, n'ont pas laupdateAlfrescoNodeRef
méthode).Expert conseil si jamais vous vous trouvez dans une situation semblable: En STS, appuyez sur CTRL+MAJ+T pour ouvrir le "Type" boîte de dialogue, saisissez le nom de la problématique de la classe pour voir une liste de projets qui ont une classe de même nom.
OriginalL'auteur Jazz
Si l'erreur s'est produite dans android studio, il peut également être un bug de l'Instant Exécuter. Dans ce cas: Fichier -> Invalider les Caches/Redémarrage. Il a résolu mon problème
OriginalL'auteur Beks
Si vous utilisez Tomcat 6+, regardez dans ~tomcat/lib de conflits de classes et de pots.
Dans Tomcat 5, regarder dans ~tomcat/commun/les classes, ~tomcat/common/lib ~tomcat/shared/classes et ~tomcat/shared/lib.
Il existe plusieurs bibliothèques dans ~tomcat/common/lib. Tous les mais les 2 sont des bibliothèques tierces. Ces deux ne contiennent pas les classes en question (que j'ai téléchargé, décompressé et vérifié).
Cela a fonctionné pour moi. Merci beaucoup ! Investi 2 h dans ce ! Un simple serveur propre fait des merveilles pour moi. Maintenant de comprendre pourquoi.
OriginalL'auteur z12345