0

我在编译对 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 依赖项已正确解析,但奇怪的是,jar 中似乎没有 setDefaultPrompt 方法:

$ 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 文件中包含的方法?

4

3 回答 3

0

您必须拥有不同版本的 JAR 文件。

于 2011-01-11T09:08:01.370 回答
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 编译的:

清单版本:1.0
 存档器版本:丛存档器
 创建者:Apache Maven
 建造者:杰森
 构建-Jdk:1.4.2_16

JRE 很好地向后兼容,但是您的 1.6.0_22 和 1.4.2_16 之间的距离非常大。

所以,我想你从源代码重新编译 jline 。

于 2011-02-02T12:52:00.780 回答
0

我在我的机器上遇到了同样的问题(编译 JRuby,而不是 Groovy)。

我的问题的解决方案是我在 /Library/Java/Extensions/jline-0_9_5.jar 中发现了一个古老的 jline jar,因此我对其进行了核对并用更现代的版本替换了它。

于 2011-04-03T15:15:10.310 回答