Java VerifyError
Résolu
Harru
-
Harru -
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 :
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 ?
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 ?
A voir également:
- Java.lang.verifyerror: bad type on operand stack
- Jeux java itel - Télécharger - Jeux vidéo
- Waptrick java football - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Waptrick java voiture - Télécharger - Jeux vidéo
- Java apk - Télécharger - Langages
2 réponses
Bonjour,
C'est pour moi toujours un problème de version :
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
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)
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.INSTANCEest 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)