如果jar类在classpath上,Java编译器看不到包

时间:2013-10-03 19:48:36

标签: java cygwin classpath javac

为什么以下命令不起作用?

$ javac -encoding UTF8 -classpath ./piccolo-1.2.jar:./piccolox-1.2.jar com/google/scrollview/ui/SVAbstractMenuItem.java

它会产生多个错误,例如

com\google\scrollview\ui\SVAbstractMenuItem.java:22: package com.google.scrollview.events does not exist
import com.google.scrollview.events.SVEventType;
                                   ^

这是文件SVAbstractMenuItem.java第22行中的真实代码,但警告语句错误,因为包存在:

$ ls com/google/scrollview/events/
Makefile  Makefile.am  Makefile.in  SVEvent.java  SVEventHandler.java  SVEventType.java

如何教这个编译器看包?

更新

代码不是我的,这是来自tesseract的makefile,我试图在cygwin下运行它。一切看起来都很正确。

包含当前目录会产生相同的结果:

$ javac -encoding UTF8 -classpath ./piccolo-1.2.jar:./piccolox-1.2.jar:. com/google/scrollview/ui/SVAbstractMenuItem.java
com\google\scrollview\ui\SVAbstractMenuItem.java:22: package com.google.scrollview.events does not exist
import com.google.scrollview.events.SVEventType;
                                   ^
com\google\scrollview\ui\SVAbstractMenuItem.java:56: cannot find symbol
symbol  : class SVWindow
location: class com.google.scrollview.ui.SVAbstractMenuItem
  public void performAction(SVWindow window, SVEventType eventType) {}
                            ^
com\google\scrollview\ui\SVAbstractMenuItem.java:56: cannot find symbol
symbol  : class SVEventType
location: class com.google.scrollview.ui.SVAbstractMenuItem
  public void performAction(SVWindow window, SVEventType eventType) {}
                                             ^
3 errors

更新2

我发现如果JAR存在于classpath参数中,就会发生这种情况。

更新3

我意识到如果冒号分隔路径,则无法处理Windows / DOS驱动器号。因此,用冒号分离是错误的。

解决

这是Cygwin / Java的不兼容性。 Windows的Java使用分号来分隔路径,而linux和makefiles则采用linux风格,即冒号。所以它不在cygwin下工作。甚至在makefile中用冒号替换分号也没有解决问题。

仅将所有jar内容解压缩到单个普通目录中。

3 个答案:

答案 0 :(得分:2)

在cygwin中使用javac可能很困难。 Java编译器不是cygwin而是windows程序。所以你必须使用Windows风格的路径。

因为在类路径中使用了冒号“:”,所以Windows Java编译器无法正确解释您的类路径。你必须使用分号“;”作为类路径中的路径分隔符。但是因为你是一个Unix风格的shell“;”终止你的命令。

编译没有cygwin的java源代码。由于结果是java类文件,因此无关紧要。或者将类似路径的参数和源文件的路径放在单引号中。

示例:

javac -encoding UTF8 -classpath '.\piccolo-1.2.jar;.\piccolox-1.2.jar;.' 'com\google\scrollview\ui\SVAbstractMenuItem.java'

另见这篇文章: setting multiple jar files as classpath in cygwin

答案 1 :(得分:1)

您忘记了类路径中的当前目录".",因此javac甚至没有搜索正确的路径。

将其加入-classpath

$ javac -encoding UTF8 -classpath ./piccolo-1.2.jar:./piccolox-1.2.jar:. com/google/scrollview/ui/SVAbstractMenuItem.java

答案 2 :(得分:0)

我在多次试验后发现的工作只是在路径开始时反复出现的反斜杠 和分号作为分隔符。

export CLASSPATH=C:\\Users/username/bla/bla.jar;C:\\Users/username/bla/bla.jar