我在编译具有jline-0.9.94 maven依赖性的代码时遇到问题。具体来说,我正在使用其默认的Ant目标编译Groovy 1.7.6并收到以下错误:
[...]
-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是破坏我的构建的方法。)
我已经尝试从我当地的maven存储库中删除jline并再次尝试,但无济于事。我还检查了来自Maven Central的jline jarfile以及具有相同结果的镜像。
奇怪的是,我可以将jar文件复制到另一台机器(Sun)并执行完全相同的步骤,并按预期在jar文件中看到setDefaultPrompt方法。其他人也在Mac上成功执行了相同的步骤。
我的机器上会发生什么事情会阻止Java工具链看到jar文件中包含的方法?
答案 0 :(得分:0)
您必须拥有不同版本的JAR文件。
答案 1 :(得分:0)
使用java 1.5.0_13
在Mac 10.5.8上无法重现如果你提取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之间的距离非常大。
所以,我想你要从source code重新编译jline。
答案 2 :(得分:0)
我的机器上遇到了同样的问题(编译JRuby,而不是Groovy)。
我的问题的解决方案是我在/Library/Java/Extensions/jline-0_9_5.jar发现了一个古老的jline jar,所以我用它来修改它并用更现代的版本替换它。