Warum ist meine javap Ausgabe anders als Sie für die gleiche JAR-Datei?
Frage
Ich habe Probleme beim Kompilieren von Code, der eine Maven Abhängigkeit von jline-0.9.94 hat. Insbesondere bin ich Kompilieren Groovy 1.7.6 mit sein Standard Ant-Ziel und immer folgende Fehlermeldung:
[...]
-banner:
[echo] Java Runtime Environment version: 1.6.0_22
[echo] Java Runtime Environment vendor: Apple Inc.
[echo] Ant version: Apache Ant version 1.7.1 compiled on June 27 2008
[echo] Operating system name: Mac OS X
[echo] Operating system architecture: x86_64
[echo] Operating system version: 10.6.6
[echo] Base directory: /Users/ldhanson2/tmp/groovy-1.7.6
[echo] Java Home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
[...]
-stagedcompile-groovy:
[groovyc] Compiling 166 source files to /Users/ldhanson2/tmp/groovy-1.7.6/target/classes
[groovyc] org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
[groovyc] Compile error during compilation with javac.
[groovyc] /Users/ldhanson2/tmp/groovy-1.7.6/src/main/groovy/ui/InteractiveShell.java:222: cannot find symbol
[groovyc] symbol : method setDefaultPrompt(java.lang.String)
[groovyc] location: class jline.ConsoleReader
[groovyc] reader.setDefaultPrompt("groovy> ");
[groovyc] ^
Die jline Abhängigkeit richtig aufgelöst wird, aber seltsamerweise die setDefaultPrompt Methode scheint nicht in das Gefäß zu sein:
$ javap -classpath target/lib/compile/jline-0.9.94.jar jline.ConsoleReader | grep setDefaultPrompt
$
(Andere Methoden aus dem javap Ausgang als auch erscheinen fehlen, aber setDefaultPrompt ist derjenige meine Build brechen.)
Ich habe versucht jline von meinem lokalen Maven-Repository auszulöschen und versuchen, wieder ohne Erfolg. Ich habe überprüft auch die jline jarfile von Maven Zentral sowie ein Spiegel mit dem gleichen Ergebnis.
Merkwürdig ist, kann ich die JAR-Datei auf einen anderen Rechner kopiert (a Sun) und genau die gleichen Schritte ausführen, und ich sehe die setDefaultPrompt Methode in der JAR-Datei wie erwartet. Andere haben erfolgreich die gleichen Schritte auf einem Mac als auch durchgeführt wird.
Was auf meinem Rechner geschehen könnte, die den Java-Toolchain nicht sehen Methoden in der JAR-Datei enthaltenen verhindern?
Lösung
Ich hatte das gleiche Problem auf meinem Rechner (Kompilieren JRuby, anstatt Groovy).
Die Lösung für mein Problem war, dass ich ein altes jline Glas bei /Library/Java/Extensions/jline-0_9_5.jar entdeckt, so dass ich es platt gemacht und ersetzen sie durch eine modernere Version.
Andere Tipps
Sie müssen verschiedene Versionen der JAR-Datei haben.
Nicht reproduzierbar auf meinem Mac 10.5.8 mit Java 1.5.0_13
Wenn Sie jline-0.9.94.jar
extrahieren und lesen seine META-INF/MANIFEST.MF
dann können Sie feststellen, dass dieses Glas von java kompiliert wurde 1.4.2_16:
Manifest-Version: 1.0 Archiver-Version: Plexus Archiver Created-By: Apache Maven Built-By: jason Build-Jdk: 1.4.2_16
JRE ist auch abwärtskompatibel, aber ein Abstand zwischen Ihrem 1.6.0_22 und 1.4.2_16 ist sehr groß.
ich dich so an, dass zu recompile jline von Quellcode .