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?

Une fois que vous avez le fichier jar extrait que vous pouvez faire javap -classpath <your-jar-file> net.wmfs.coalesce.aa.dao.MediaDao et il doit énumérer les signatures de méthode. docs
comparer 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