Cygwin上的Java路径问题

时间:2012-03-25 16:03:26

标签: java cygwin

我正在尝试使用本机Win32 Java在Cygwin下编译Java项目。

在我的计算机上的/cygdrive/c/jdk/bin下正确找到了Java二进制文件。

以下命令正常工作:

javac -d . ./gnu/kawa/util/PreProcess.java

PreProcess.class文件在./gnu/kawa/util/中生成。然而,尝试在此上调用Java失败了:

CLASSPATH=.:$CLASSPATH java gnu.kawa.util.PreProcess \
   %java6 +use:com.sun.net.httpserver +enable:XML \
   `sed -e 's|\([^ ]*\)|./\1|' < ./patch-source-list`
Error: Could not find or load main class gnu.kawa.util.PreProcess
...

此命令由make调用,这是$CLASSPATH变量动态设置的位置。 patch-source-list只是一个类名列表。类路径中的:看起来很可疑,但我不确定如何测试;而不烦恼sh

我唯一的另一个怀疑是本机Java正在尝试gnu\kawa\util\PreProcess,但我认为cygwin可以透明地处理它。

有什么想法吗?谢谢你的时间。

3 个答案:

答案 0 :(得分:4)

另一种选择是使用':'构建路径,然后使用cygpath修复结果。这在你的特定情况下可能有些过分,但在一般情况下,你可能会引用多个目录,其中一些可能被引用为绝对路径而不是相对路径,或者如果你正在使用cygwin符号链接,它会更有用

$ ln -s /cygdrive/c/development/libraries/ ../libs
$ cygpath -pw /cygdrive/c/development/:.:../libs
C:\development\;.;C:\development\libraries\

那么你就像以前一样构建你的CLASSPATH变量,并在最后阶段运行

CLASSPATH="`cygpath -pw "$CLASSPATH"`" java (whatever)

答案 1 :(得分:3)

请记住,JVM不知道您使用的是cygwin bash shell。

两件事:

  1. 对于类路径位置,请使用Windows路径名称。因此,没有“/ cygdrive / c / somepath”,但是“c:\ somepath \”(“/”和“\”可以互换使用)
  2. 使用';'而不是类路径列表中的“:”
  3. 这应该有效:

    export CLASSPATH="./gnu/kawa/util/PreProcess.class"
    CLASSPATH=".;$CLASSPATH" java gnu.kawa.util.PreProcess
    

答案 2 :(得分:1)

  

类路径中的:看起来很可疑,但我不确定如何测试;而不会烦恼sh

你是完全正确的:你需要使用;而不是:。至于如何使用它 - 如上面提到的那样,你需要"quote"分号。其中任何一个都可行:

CLASSPATH=.\;$CLASSPATH java Foo

CLASSPATH=.';'$CLASSPATH java Foo

CLASSPATH='.;'$CLASSPATH java Foo

CLASSPATH=".;$CLASSPATH" java Foo

您可以使用自己最喜欢的一个。 (第一个使用反斜杠,引用单个跟随字符。第二个和第三个使用单引号,引用零个或多个字符的序列。第四个使用双引号,就像单引号,除了它们仍然允许扩展变量$CLASSPATH。就此而言,您也可以编写类似

的内容
CLASSPATH=".;"$CLASSPATH java Foo

如果你愿意的话。有关在Bash中引用的更多信息,请参阅上面的链接。)