2012-03-13 66 views
14

我正在尝试编写一个BASH脚本来让我的Java程序运行(常见问题,对吧?)。我只是无法完成它的工作。许多编辑之后,这里就是我想设置classpath中,然后执行该程序:如何从Cygwin运行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 

对不起的那些杂乱,我只是想一次做的一切。它告诉我,主类我的程序不能被发现!((

任何想法?

+0

您是否试过'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 2012-03-13 19:37:46

+0

如果你愿意,它会不会更容易将这些jar添加到你的类路径而不是全部输入吗?或者,你不能这样做吗? – 2012-03-13 19:41:21

+0

有关Java和Cygwin的常见问题解答:http://www.inonit.com/cygwin/faq/ - 给出一个很好的解释什么时候以及如何转换Cygwin和Windows之间的类路径Java – 2016-06-08 09:24:27

回答

11
  • 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 
+0

谢谢,有了这个和一些小的调整一切正常。 – blaughli 2012-03-15 21:48:09

+0

@ user1010997是正确的。一个需要-pw。 – 2016-06-17 19:28:25

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
  1. 您必须使用反引号(“` “符号)或$(CMD)的bash语法时才替换CMD输出
  2. java的不理解UNIX的(cygwin-)风格的路径,只有Windows风格。

最后first link in google回答您的问题

5
  • 在bash中,语法$(command)比反引号`command`
  • cygpath更清晰有-p选项转换路径 - 像Windows和Unix之间的值(而不是单一路径名称),即
    • 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的调用。

0

该问题的主要原因不是反而是结肠与分号相关的问题。由于在cygwin中,运行在那里的java针对的是DOS/Windows环境,它期望';'作为路径分隔符。

虽然backtic确实有帮助,但问题的根本原因必须强调':'和';'之间的区别。当Java在Unix或Windows环境中时。