Проблемы с путями Java на Cygwin - PullRequest
2 голосов
/ 25 марта 2012

Я пытаюсь скомпилировать проект Java под Cygwin, используя нативную Win32 Java.

Двоичные файлы Java правильно находятся на моем компьютере под /cygdrive/c/jdk/bin.

Следующая команда отлично работает:

javac -d . ./gnu/kawa/util/PreProcess.java

Файл PreProcess.class создается в ./gnu/kawa/util/. Однако попытка вызвать Java на этом не удалась:

CLASSPATH=.:$CLASSPATH java gnu.kawa.util.PreProcess \
   %java6 +use:com.sun.net.httpserver +enable:XML \
   `sed -e 's|\([^ ]*\)|./\1|' < ./patch-source-list`
Error: Could not find or load main class gnu.kawa.util.PreProcess
...

Эта команда была вызвана make, вот где переменная $CLASSPATH устанавливается динамически. patch-source-list это просто список имен классов. : в пути к классам выглядит подозрительно, но я не уверен, как проверить ;, не раздражая sh.

Мое единственное другое подозрение в том, что нативная Java пытается gnu\kawa\util\PreProcess, но я думаю, что cygwin может прозрачно справиться с этим.

Есть идеи? Спасибо за ваше время.

Ответы [ 3 ]

4 голосов
/ 06 декабря 2013

Другой вариант - построить путь, используя ':', а затем исправить результаты, используя cygpath.Это, вероятно, излишне в вашей конкретной ситуации, но в общем случае, когда у вас могут быть ссылки на несколько каталогов, на некоторые из которых можно ссылаться как на абсолютные, а не на относительные пути, или если вы работаете с символическими ссылками Cygwin, это гораздо более полезно.

$ ln -s /cygdrive/c/development/libraries/ ../libs
$ cygpath -pw /cygdrive/c/development/:.:../libs
C:\development\;.;C:\development\libraries\

, поэтому вы должны построить переменную CLASSPATH, как и раньше, и на последнем этапе запустить

CLASSPATH="`cygpath -pw "$CLASSPATH"`" java (whatever)
3 голосов
/ 08 июня 2012

Помните, JVM не подозревает, что вы используете оболочку cygwin bash.

Две вещи:

  1. для местоположений пути к классам, используйте имена путей Windows.Таким образом, нет "/ cygdrive / c / somepath" , но "c: \ somepath \" (однако "/" и "\" могут использоваться взаимозаменяемо)
  2. использовать ';'вместо ':' в списке путей к классам

Это должно работать:

export CLASSPATH="./gnu/kawa/util/PreProcess.class"
CLASSPATH=".;$CLASSPATH" java gnu.kawa.util.PreProcess
1 голос
/ 25 марта 2012

: в пути к классам выглядит подозрительно, но я не уверен, как проверить ;, не раздражая sh.

Вы совершенно правы: вам нужно использовать ; вместо :. Что касается того, как его использовать & mdash; как упоминается в вышеприведенном мате, вам нужно "цитировать" точку с запятой. Любой из них будет работать:

CLASSPATH=.\;$CLASSPATH java Foo

CLASSPATH=.';'$CLASSPATH java Foo

CLASSPATH='.;'$CLASSPATH java Foo

CLASSPATH=".;$CLASSPATH" java Foo

Вы можете использовать тот, который вам больше нравится. (Первая использует обратную косую черту, которая заключает в себе один следующий символ. Вторая и третья используют одинарные кавычки, которые заключают в себе последовательность из нуля или более символов. Четвертая использует двойные кавычки, которые похожи на одинарные кавычки, за исключением того, что они все еще разрешить расширение переменной $CLASSPATH. В этом случае вы также можете написать что-то вроде

CLASSPATH=".;"$CLASSPATH java Foo

если хочешь. См. Ссылку выше для получения дополнительной информации о цитировании в Bash.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...