IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Erreur java.lang.NoSuchMethodError inexplicable


Sujet :

Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 328
    Points : 695
    Points
    695
    Par défaut Erreur java.lang.NoSuchMethodError inexplicable
    Bonjour,

    Je développe un jar destiné à être utilisé par une application d'un client.
    Ce jar est généré à l'aide de scripts ant plutôt rodés qui tournent depuis pas mal de temps donc de ce côté là il me semble que rien ne cloche.
    Le jar est incorporé dans une publication que l'on ouvrira avec l'application du client. Ces publications sont générés sur un serveur dédié, donc nous récupérons tous la même version du jar.
    Sur ma machine (windows 7) survient systématiquement une java.lang.NoSuchMethodError. Quand je décompile le jar en question, je m'aperçois que la méthode est bien là.
    Sur les machines autres que la mienne, aucun problème de méthode manquante. Tout fonctionne normalement.

    J'ai donc :
    - vidé le cache java : sans succès
    - désactivé le cache java : sans succès
    - supprimé (1.6.0_31) puis réinstallé java (1.6.0_20) : sans succès
    - vidé un peu tous les répertoires temporaires que j'ai trouvé dans windows et dans mon compte utilisateur : sans succès
    - rétablir les options par défaut des paramètres des fichiers temporaires dans les options java : sans succès.

    Je suis à deux doigts de contacter un exorciste. Je cherche une explication à ce comportement étrange mais là j'ai vraiment fait le tour de ce que je connaissais.
    Y a-t-il une manip que je puisse faire en manuel pour être sûr de n'avoir plus aucun cache java ?
    J'ai fouiné dans le répertoire par défaut du cache java : C:\Users\{user}\AppData\LocalLow\Sun\Java\Deployment\cache.
    Là se trouvent des répertoires : "0", "1", "2", "3", ..., 63, host, muffin, splash. Ceux-ci sont bel et bien vides après nettoyage du cache dans les options.
    Je cherche éventuellement un moyen de changer l'emplacement des fichiers temporaires java mais le bouton "Modifier..." est désactivé.

    Merci d'avance pour votre aide et bonne journée.

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Quel est le stacktrace complet de l’exception ?
    De quelle méthode s'agit-il ?


    a++

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 328
    Points : 695
    Points
    695
    Par défaut
    Alors je maîtrise pas tout le processus d'appel de la méthode étant donné que le jar est utilisé par l'application au travers de ces fameuses publications.
    Voilà ce que j'ai comme stack trace, j'ai masqué qqs packages pour ne pas violer d'éventuelles clauses de confidentialité.
    Lorsque je décompile mon jar, je vois bien que ma classe ExhaustiveSearchServiceResponse contient le membre customer (String) ainsi que ses accesseurs getCustomer et setCustomer.
    Ce qui me tarabuste le plus, c'est que ce phénomène survient uniquement sur ma machine et pourtant nous utilisons tous la même publication (donc le même jar).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    java.lang.NoSuchMethodError: com.[...].plugin.ips.common.service.ExhaustiveSearchServiceResponse.setCustomer(Ljava/lang/String;)V
    	at com.[...].plugin.ips.server.service.ExhaustiveSearchExecutorServer.setReponse(Unknown Source)
    	at com.[...].plugin.ips.server.service.ExhaustiveSearchExecutorServer.getPubliParameters(Unknown Source)
    	at com.[...].plugin.ips.server.service.ExhaustiveSearchExecutorServer.execute(Unknown Source)
    	at com.[...].server.manager.service.CommunicationServiceWrapper.invoke(Unknown Source)
    	at com.[...].connection.ServerConnectionManager.handleRequestFromPlugin(Unknown Source)
    	at com.[...].connection.ServerActionDispatcher.doRequestFromPlugin(Unknown Source)
    	at com.[...].server.servlet.ServerActionDispatcher.doRequestFromPlugin(Unknown Source)
    	at com.[...].connection.ServerActionDispatcher.dispatch(Unknown Source)
    	at com.[...].connection.ServerActionDispatcher.doPost(Unknown Source)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
    	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
    	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
    	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
    	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
    	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
    	at java.lang.Thread.run(Unknown Source)
    Cdlmt

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Tu peux afficher la liste des méthodes de cette classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	for (Method m : ExhaustiveSearchServiceResponse.class.getMethods()) {
    		System.out.println(m);
    	}

    L'application comporte-t-elle plusieurs jar ? Vérifie bien que la classe ne soit pas défini deux fois...


    a++

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 328
    Points : 695
    Points
    695
    Par défaut
    L'application utilise en effet plusieurs jar (c'est le moins que l'on puisse dire), c'est une méchante usine à gaz que nous paramétrons dans nos publications.
    Elle utilise en fait de nombreuses librairies qu'elle intègre elle-même mais également des jar contenus dans nos publications.
    Je vais tenter une désinstallation complète de l'application puis réinstallation et après ça, si ça ne marche toujours pas, je refilerai le bébé.
    :-)
    Merci pour ton aide en tout cas.

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    La cause la plus probable que je connaisse effectivement de ce comportement (méthode absente seulement sur certaines jvm / os) c'est d'avoir la classe en double. Comme il n'y a pas de règle précise sur l'ordre dans lequel les jar sont chargés, sur ton os, il est probable que le "mauvais" jar soit chargé en premier, du coup la mauvaise version de la classe est chargées, du coup la méthode n'existe pas. Sur une machine linux, prendre l'ensemble des jar constituant et faire un

    grep plugin.ips.common.service.ExhaustiveSearchServiceResponse *.jar

    permet déjà de dégrossir rapidement le problème.

    Deuxième possibilité encore plus chiante, le script ant a une erreur et inclue deux version de la classe dans le même jar => Ca devrait se voir rapidement avec winzip. Fondamentalement pour la jvm c'est le même problème: quel .class prendre ?



    aussi, tu déclare en décompilant le jar que la méthode est là. Elle a bien exactement la bonne signature:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void setCustomer(String arg0)
    ? Souvent en vérifiant, on oublie de vérifier le type de retour dans la signature

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 328
    Points : 695
    Points
    695
    Par défaut
    Tout d'abord merci pour votre aide. J'ai finalement désinstallé puis réinstallé l'application en question et le problème a disparu.
    Je pense que l'application devait avoir un cache perdu qq part ailleurs que dans le répertoire habituel (peut-être à cause d'un crash ou d'un arrêt inopiné du serveur).
    Je mets le sujet à résolu mais je doute que ça serve à beaucoup de monde... Sauf peut-être à mes collègues.
    ;-)

    Merci et bonne journée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/12/2012, 10h46
  2. Réponses: 3
    Dernier message: 31/07/2012, 02h42
  3. Réponses: 3
    Dernier message: 09/04/2008, 11h24
  4. erreur de fou (java.lang.NoSuchMethodError : main)
    Par saih_tam dans le forum Langage
    Réponses: 5
    Dernier message: 27/04/2007, 21h36
  5. java.lang.NoSuchMethodError erreur java
    Par mistify dans le forum Langage
    Réponses: 7
    Dernier message: 24/10/2006, 16h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo