如何在Cygwin中运行Java

17

我正在尝试编写一段BASH脚本来运行我的Java程序(这是一个常见的问题,对吧?)。 但我似乎无法让它正常工作。在多次编辑后,以下是我设置类路径并执行程序的方式:

java -classpath 'cygpath -u "/cygdrive/c/Projects/common/lib/rome-1.0.jar:/cygdrive
/c/Projects/common/lib/jdom-1.0.jar:/cygdrive/c/Projects/common/lib/jsoup-1.6.1.jar:
/cygdrive/c/Projects/common/lib/mysql-connector-java-5.1.18-bin.jar:/cygdrive/c/Projects
/Freereader/bin/"' com.free.syndication.SQLfeeder

抱歉我的表述有点混乱,我只是想一次性解决所有问题。程序告诉我找不到主类!((

有任何想法吗?


你试过 echo 'cygpath -u "/cygdrive/c/Projects/common/lib/rome-1.0.jar:/cygdrive/c/Projects/common/lib/jdom-1.0.jar:/cygdrive/c/Projects/common/lib/jsoup-1.6.1.jar:/cygdrive/c/Projects/common/lib/mysql-connector-java-5.1.18-bin.jar:/cygdrive/c/Projects/Freereader/bin/"' 确定它生成正确的路径了吗? - TheLQ
如果您将这些JAR文件直接添加到类路径中,而不是一个个手动输入,那不是会更容易吗?或者,在您的情况下无法这样做吗? - Zack Macomber
Java和Cygwin常见问题解答:http://www.inonit.com/cygwin/faq/ - 提供了一个很好的解释,说明何时以及如何在Cygwin和Windows的Java之间转换类路径。 - Peter Wippermann
5个回答

12
  • Java的类路径使用分号作为标记分隔符。
  • 使用反引号而非单引号。

尝试:

java -classpath `cygpath -u "/cygdrive/c/Projects/common/lib/rome-1.0.jar;/cygdrive
/c/Projects/common/lib/jdom-1.0.jar;/cygdrive/c/Projects/common/lib/jsoup-1.6.1.jar;
/cygdrive/c/Projects/common/lib/mysql-connector-java-5.1.18-bin.jar;/cygdrive/c/Projects
/Freereader/bin/"` com.free.syndication.SQLfeeder

谢谢,通过这个和一些微调,一切都正常工作了。 - blaughli

5
  • 在Bash中,语法$(command)比反引号`command`更清晰易懂。
  • cygpath有一个-p选项,可以在Windows和Unix之间转换类似PATH的值(而不是单个路径名),即
    • cygpath -pu 'C:\Users\me\bin;C:\Users\me\project\bin'将给出/cygdrive/c/Users/me/bin:/cygdrive/c/Users/me/project/bin
    • cygpath -pw将以相反的方向执行相同的操作。

请注意,cygpath -u "/cygdrive/c"(如您的问题所示)不会改变任何内容,因为目录名已经是所需的(Unix)语法。您也可以省略它。

因此,命令变为:

CP="C:/Projects/common/lib/rome-1.0.jar;C:/Projects/common/lib/jdom-1.0.jar;C:/Projects/common/lib/jsoup-1.6.1.jar;
C:/Projects/common/lib/mysql-connector-java-5.1.18-bin.jar;C:/Projects
/Freereader/bin"
# for a Windows Java binary:
java -classpath "$(cygpath -pw "$CP")" com.free.syndication.SQLfeeder 
# for a Unix Java binary:
java -classpath "$(cygpath -pu "$CP")" com.free.syndication.SQLfeeder 

另外,您也可以使用类Unix样式的类路径开始,但命令保持不变。在任何情况下,如果类路径已经是所需的语法,则当然可以省略对cygpath的调用。


2

你不需要反引号吗?

java -classpath `cygpath -u "/cygdrive/c/Projects/common/lib/rome-1.0.jar:/cygdrive
/c/Projects/common/lib/jdom-1.0.jar:/cygdrive/c/Projects/common/lib/jsoup-1.6.1.jar:
/cygdrive/c/Projects/common/lib/mysql-connector-java-5.1.18-bin.jar:/cygdrive/c/Projects
/Freereader/bin/"` com.free.syndication.SQLfeeder

1
主要问题的原因不是反引号,而是冒号和分号的问题。由于在cygwin中运行的java是针对DOS / Windows环境的,因此它期望';'作为路径分隔符。
虽然反引号确实有所帮助,但是当Java在Unix或Windows环境中时,必须强调':'和';'之间的区别是主要根本原因。

1
  1. 您必须使用反引号('`'符号)或$(cmd) bash语法来替换cmd输出
  2. Java不理解Unix(Cygwin)风格的路径,只能理解Windows风格的路径。

最后谷歌搜索结果中的第一个链接可以回答您的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接