Почему мой вывод javap отличается от вашего для одного и того же файла jar?

StackOverflow https://stackoverflow.com/questions/4655852

Вопрос

У меня возникли проблемы с компиляцией кода, который имеет зависимость maven от jline-0.9.94.В частности, я компилирую Заводной 1.7.6 используя свою цель Ant по умолчанию и получая следующую ошибку:

[...]
-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]               ^

Зависимость jline разрешена правильно, но, как ни странно, метод setDefaultPrompt, похоже, не присутствует в jar:

$ javap -classpath target/lib/compile/jline-0.9.94.jar jline.ConsoleReader | grep setDefaultPrompt
$ 

(Другие методы также отсутствуют в выходных данных javap, но setDefaultPrompt - это тот, который нарушает мою сборку.)

Я пытался удалить jline из моего локального репозитория maven и повторял попытку, но безрезультатно.Я также проверил файл jline jarfile из Maven Центральный а также зеркало с теми же результатами.

Как ни странно, я могу скопировать файл jar на другой компьютер (Sun) и выполнить точно такие же шаги, и я вижу метод setDefaultPrompt в файле jar, как и ожидалось.Другие пользователи также успешно выполнили те же действия на компьютере Mac.

Что может происходить на моем компьютере, что помешало бы Java toolchain видеть методы, содержащиеся в файле jar?

Это было полезно?

Решение

У меня была та же проблема на моей машине (компиляция JRuby, а не Groovy).

Решение моей проблеме было то, что я обнаружил, что я обнаружил древнюю jline jline на /library/java/extensions/jline-0_9_5.jar, поэтому я наколал его и заменил его с более современной версией.

Другие советы

У вас должны быть разные версии файла JAR.

Не воспроизводится на моем Mac 10.5.8 с Java 1.5.0_13

Если вы извлекаете jline-0.9.94.jar и прочитал его META-INF/MANIFEST.MF затем вы можете обнаружить, что этот jar был скомпилирован 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 хорошо совместим с обратной связью, но расстояние между вашими 1.6.0_22 и 1.4.2_16 очень велико.

Итак, я полагаю, вам следует перекомпилировать jline из исходный код.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top