Why is my javap output different than yours for the same jar file?

≯℡__Kan透↙ 提交于 2019-12-11 16:42:16

问题


I'm having trouble compiling code which has a maven dependency on jline-0.9.94. Specifically, I'm compiling Groovy 1.7.6 using its default Ant target and getting the following error:

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

The jline dependency is correctly resolved, but strangely the setDefaultPrompt method does not appear to be present in the jar:

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

(Other methods appear missing from the javap output as well, but setDefaultPrompt is the one breaking my build.)

I've tried wiping out jline from my local maven repository and trying again, to no avail. I've also checked the jline jarfile from Maven Central as well as a mirror with the same results.

Oddly, I can copy the jar file to a different machine (a Sun) and perform the exact same steps and I see the setDefaultPrompt method in the jar file as expected. Others have successfully performed the same steps on a Mac as well.

What could be happening on my machine which would prevent the Java toolchain from seeing methods contained in the jar file?


回答1:


I had the same problem on my machine (compiling JRuby, rather than Groovy).

The solution to my problem was that I discovered an ancient jline jar at /Library/Java/Extensions/jline-0_9_5.jar, so I nuked it and replaced it with a more modern version.




回答2:


You must have different versions of the JAR file.




回答3:


Not reproducible on my Mac 10.5.8 with java 1.5.0_13

If you extract jline-0.9.94.jar and read its META-INF/MANIFEST.MF then you may find that this jar was compiled by 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 is well backward compatible, but a distance between your 1.6.0_22 and 1.4.2_16 is very big.

So, I suppose you to recompile jline from source code.



来源:https://stackoverflow.com/questions/4655852/why-is-my-javap-output-different-than-yours-for-the-same-jar-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!