Как запустить Java из Cygwin

Я пытаюсь написать BASH script, чтобы запустить мою программу 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

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

Любые идеи?

Ответ 1

  • Java classpath использует точку с запятой в качестве разделителя маркеров.
  • Использовать backticks вместо одиночных кавычек

Try:

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

  • В 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, если путь класса уже находится в желаемом синтаксисе.

Ответ 3

Вам не нужны обратные ссылки?

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

Ответ 4

  • Вы должны использовать обратные ссылки (символ `) или $(cmd) bash sytax для замены вывода cmd
  • java не понимает пути unix- (cygwin-), только в стиле Windows.

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

Ответ 5

Основная причина проблемы - это не бэктик, а вопрос о двоеточии против полуколонии. Поскольку в cygwin java работает для среды DOS/Windows, она ожидает ';' как разделитель путей.

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