Java VerifyError

[Résolu/Fermé]
Signaler
-
 Harru -
Bonjour,


Je développe actuellement une application se basant sur Hadoop avec un bon nombre de jar différent importés et j'obtiens l'erreur suivante :


Exception in thread "main" java.lang.VerifyError: Bad type on operand stack
Exception Details:
Location:
org/apache/hadoop/mapred/JobTrackerInstrumentation.create(Lorg/apache/hadoop/mapred/JobTracker;Lorg/apache/hadoop/mapred/JobConf;)Lorg/apache/hadoop/mapred/JobTrackerInstrumentation; @5: invokestatic
Reason:
Type 'org/apache/hadoop/metrics2/lib/DefaultMetricsSystem' (current frame, stack[2]) is not assignable to 'org/apache/hadoop/metrics2/MetricsSystem'
Current Frame:
bci: @5
flags: { }
locals: { 'org/apache/hadoop/mapred/JobTracker', 'org/apache/hadoop/mapred/JobConf' }
stack: { 'org/apache/hadoop/mapred/JobTracker', 'org/apache/hadoop/mapred/JobConf', 'org/apache/hadoop/metrics2/lib/DefaultMetricsSystem' }
Bytecode:
0000000: 2a2b b200 03b8 0004 b0

at org.apache.hadoop.mapred.LocalJobRunner.<init>(LocalJobRunner.java:573)
at org.apache.hadoop.mapred.JobClient.init(JobClient.java:494)
at org.apache.hadoop.mapred.JobClient.<init>(JobClient.java:479)
at org.apache.hadoop.mapreduce.Job$1.run(Job.java:563)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657)
at org.apache.hadoop.mapreduce.Job.connect(Job.java:561)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:549)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:580)
at fr.silpc.hadoop.GetStats.main(GetStats.java:82)


Jusque la toute les erreurs que j'ai rencontré était dut à une classe manquante ou une incompatibilité de version qui se réglait en ajoutant ou modifiant la version d'un jar. Mais avec cette erreur je ne vois pas quoi faire.


Auriez-vous quelques idées ?

2 réponses

Messages postés
16372
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2021
2 861
Bonjour,

C'est pour moi toujours un problème de version :
Type 'org/apache/hadoop/metrics2/lib/DefaultMetricsSystem' (current frame, stack[2]) is not assignable to 'org/apache/hadoop/metrics2/MetricsSystem'

Il doit y avoir confusion entre l'interface MetricsSystem dont hérite l'enum DefaultMetricsSystem (version r1.2.1 par exemple) et l'ancienne public abstract class MetricsSystem (version r0.23.11 par exemple) que ne peux pas étendre DefaultMetricsSystem puisque c'est un enum...

Du coup l'assignation
MetricsSystem metrics = DefaultMetricsSystem.INSTANCE
est invalide à l'exécution.

Il faudrait identifier quel jar possède l'ancienne dépendance de MetricsSystem et le mettre plus bas dans le classpath, derrière le jar qui possède la bonne dépendance MetricsSystem (qui possède probablement aussi DefaultMetricsSystem). Comme ça, le deuxième chargement sera ignoré et c'est la bonne version de MetricsSystem qui sera utilisée.

Remarque : pour gérer tes dépendances sans (trop) se casser la tête, tu devrais regarder du côté de Maven. (Débuter avec Maven)
Merci de ta réponse, j'ai résolu mon problème.

Les anciennes versions des jar n'était plus dans le classpath mais était toujours présent dans un dossier du projet. En les supprimant de ce dossier ça marche.