【问题标题】:How to run Java from Cygwin如何从 Cygwin 运行 Java
【发布时间】:2012-03-13 19:31:54
【问题描述】:

我正在尝试编写一个 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/"' 以确保其路径正确?
  • 如果您将这些 jars 直接添加到您的类路径中而不是全部输入,会不会容易很多?或者,在你的情况下你不能这样做吗?
  • 关于 Java 和 Cygwin 的常见问题解答:inonit.com/cygwin/faq - 很好地解释了何时以及如何在 Cygwin 和 Windows 的 Java 之间转换类路径

标签: java bash cygwin classpath


【解决方案1】:
  • 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

【讨论】:

  • 谢谢,有了这个和一些细微的调整,一切正常。
【解决方案2】:

问题的主要原因不是反引号,而是冒号与分号的问题。由于在 cygwin 中,在那里运行的 java 适用于 DOS/Windows 环境,因此它需要 ';'作为路径分隔符。

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

【讨论】:

    【解决方案3】:
    • 在 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 的调用。

    【讨论】:

      【解决方案4】:

      你不需要反引号吗?

      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
      

      【讨论】:

        【解决方案5】:
        1. 您必须使用反引号('`' 符号)或 $(cmd) bash 语法来替换 cmd 输出
        2. java 不理解 unix- (cygwin-) 样式路径,只能理解 windows 样式。

        最后first link in google回答了你的问题

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-24
          • 1970-01-01
          • 1970-01-01
          • 2015-06-21
          • 2015-06-22
          • 1970-01-01
          相关资源
          最近更新 更多