我正在尝试使用本机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可以透明地处理它。
有什么想法吗?谢谢你的时间。
答案 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。
两件事:
这应该有效:
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中引用的更多信息,请参阅上面的链接。)