Perché il mio diverso uscita javap del tuo per lo stesso file jar?
Domanda
Ho problemi compilazione di codice che ha una dipendenza Maven su jline-0.9.94. In particolare, sto compilando Groovy 1.7.6 utilizzando suo default target Ant e ottenere il seguente errore:
[...]
-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] ^
La dipendenza jline è correttamente risolto, ma stranamente il metodo setDefaultPrompt non sembra essere presente nel vaso:
$ javap -classpath target/lib/compile/jline-0.9.94.jar jline.ConsoleReader | grep setDefaultPrompt
$
(Altri metodi apparire manca l'uscita javap pure, ma setDefaultPrompt è quello spezzando il build.)
Ho provato a spazzare via jline dal mio repository Maven locale e provare di nuovo, senza alcun risultato. Ho anche controllato il jarfile jline da Maven centrale così come uno specchio con gli stessi risultati.
Stranamente, posso copiare il file jar ad una macchina diversa (un Sole) ed eseguire la stessa procedura e vedo il metodo setDefaultPrompt nel file jar come previsto. Altri hanno eseguito con successo la stessa procedura su un Mac pure.
Che cosa potrebbe accadere sulla mia macchina che impedirebbe la toolchain Java di vedere metodi contenuti nel file jar?
Soluzione
Ho avuto lo stesso problema sulla mia macchina (compilazione JRuby, piuttosto che Groovy).
La soluzione al mio problema è che ho scoperto un antico vaso jline a /Library/Java/Extensions/jline-0_9_5.jar, così ho nuked esso e lo ha sostituito con una versione più moderna.
Altri suggerimenti
È necessario disporre di diverse versioni del file JAR.
Non è riproducibile sul mio Mac 10.5.8 con Java 1.5.0_13
Se si estrae jline-0.9.94.jar
e leggere la sua META-INF/MANIFEST.MF
allora si potrebbe scoprire che questo barattolo è stato compilato da Java 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 è ben compatibile, ma una distanza tra la 1.6.0_22 e 1.4.2_16 è molto grande.
Quindi, io supporti a jline ricompilazione da codice sorgente .