Как запустить Java из Cygwin - PullRequest
15 голосов
/ 13 марта 2012

Я пытаюсь написать 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

Извините за беспорядок, я просто пытаюсь сделать все сразу. Он говорит мне, что основной класс моей программы не может быть найден! ((

Есть идеи?

Ответы [ 5 ]

12 голосов
/ 13 марта 2012
  • Java classpath использует точку с запятой в качестве разделителя токенов.
  • Используйте обратные кавычки вместо одинарных кавычек

Попробуйте:

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 голосов
/ 14 мая 2013
  • В bash синтаксис $(command) более понятен, чем обратные черты `command`
  • cygpath имеет опцию -p для преобразования значений, похожих на PATH (в отличие от имен одиночных путей) между 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, если путь к классу уже находится в желаемом синтаксисе.

2 голосов
/ 13 марта 2012

Разве вам не нужны спины?

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 голос
/ 20 декабря 2016

Основной причиной проблемы является НЕ backtic, а вместо этого проблема двоеточия по сравнению с точкой с запятой.Так как в cygwin Java работает для среды DOS / Windows, она ожидает ';'в качестве разделителя пути.

Несмотря на то, что backtic действительно помогает, основной причиной проблемы должно быть выделение различий между ':' и ';'когда Java работает в Unix или в среде Windows.

1 голос
/ 13 марта 2012
  1. Вы должны использовать обратные символы (символ '`') или синтаксис bash $ (cmd) для замены вывода cmd
  2. java не понимает пути в стиле unix (cygwin-), только в стиле Windows.

И наконец первая ссылка в Google отвечает на ваш вопрос

...