繁体   English   中英

Java编译器在类路径上的jar上看不到包

[英]Java compiler does not see packages if jar on classpath

为什么跟随命令不起作用?

$ 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

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

更新3

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

解决了

这是Cygwin / Java不兼容。 Windows的Java使用分号分隔路径,而linux和makefiles扩展linux样式,即冒号。 因此,在Cygwin下无法正常工作。 即使将makefile中的冒号替换为分号也无法解决问题。

仅将所有jar内容提取到单个纯目录中是有帮助的。

在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'

另请参阅此帖子: 在cygwin中将多个jar文件设置为类路径

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

包括在-classpath

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

经过多次试验,我发现行之有效的是仅在路径开头使用了转义的反斜杠,并使用分号作为分隔符。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM