【问题标题】:Java compiler does not see packages if jar on classpath如果类路径上有 jar,Java 编译器看不到包
【发布时间】:2013-10-03 19:48:36
【问题描述】:

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

$ 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,我发现会发生这种情况。

更新 3

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

已解决

这是 Cygwin/Java 的不兼容问题。 Windows 的 Java 使用分号分隔路径,而 linux 和 makefile 则使用 linux 样式,即冒号。所以它在cygwin下不起作用。即使在makefile中将冒号替换为分号也不能解决问题。

仅将所有 jars 内容提取到单个普通目录中会有所帮助。

【问题讨论】:

  • 你能展示你的包结构和你的pwd吗?
  • 嗯,make 用于 Java?它不建立?也许为 Java 编写的构建更有可能工作。
  • pwd 无关紧要,但我可以说它很长;可能会发生一些截断?
  • @PeterLawrey 它也不能按原样运行,不仅来自 make
  • @SuzanCioc 这就是为什么我使用 IDE 来确保路径正确并使用 maven 进行构建,而我永远不需要担心这些问题。

标签: java cygwin classpath javac


【解决方案1】:

在 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

【讨论】:

    【解决方案2】:

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

    将其包含在-classpath

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

    【讨论】:

    • 我在$ 提示符下假设您使用的是直接的 Unix 或 Linux。因为 cygwin 在 Windows 上运行,所以可能需要一个 Windows 路径分隔符。尝试使用 ; 作为路径分隔符,而不是 :
    【解决方案3】:

    经过多次试验,我发现只有在路径开头的反斜杠转义 和分号作为分隔符。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 2014-05-05
      • 1970-01-01
      • 2011-12-16
      • 2011-12-08
      • 1970-01-01
      相关资源
      最近更新 更多