Как заставить java распознавать символические ссылки под cygwin - PullRequest
1 голос
/ 27 мая 2010

Вот очень простая Java-программа для печати первой строки файла:

import java.io.*
public class test {
  public static void main(String[] args) throws IOException {
    System.out.print(new BufferedReader(new FileReader(args[0])).readLine());
  }
}

Когда я запускаю эту программу под cygwin и передаю ей имя символической ссылки, она печатает содержимое символической ссылки, а не цель этой ссылки:

$ echo foo > testfile
$ ln -s testfile symlink_to_testfile
$ java test testfile
foo
$ java test symlink_to_testfile
!<symlink> ?t e s t f i l e

Как мне убедить Java следовать символической ссылке? Я надеялся, что было что-то более простое, чем реализация самого перенаправления.

Ответы [ 4 ]

2 голосов
/ 13 ноября 2012

Мне нравится ответ derpaderp, поэтому я настроил его под свои нужды. В более общем случае не предполагается использование опции -jar и не возникают проблемы с аргументами, содержащими пробелы. Я переместил этот скрипт в /usr/bin/java и сделал его исполняемым.

#!/bin/sh    

JAVA_PATH="/cygdrive/c/Program Files/Java/jre7/bin/java"


declare -a WINDOWS_ARGS
i=0
for ARG in "$@"
do

    if [ -e "$ARG" ]; then
        # pathname argument is only converted if the file exists,
        # so this trick may not be appropriate everywhere...
        WINDOWS_ARGS[$i]="`cygpath -w $ARG`"
    else
        WINDOWS_ARGS[$i]="$ARG"
    fi
    (( i++ ))
done
"$JAVA_PATH" "${WINDOWS_ARGS[@]}"
2 голосов
/ 24 февраля 2012

У меня тоже была эта проблема, поэтому я написал оболочку, включающую что-то вроде

# java runs as native windows program, so convert pathnames
WINDOWS_ARGS=""
for ARG in $*
do
if [ -e $ARG ]
# pathname argument is only converted if the file exists,
# so this trick may not be appropriate everywhere...
then
WINDOWS_ARGS="$WINDOWS_ARGS `cygpath -w $ARG`"
else
WINDOWS_ARGS="$WINDOWS_ARGS $ARG"
fi
done
java -jar `cygpath -w myprogram.jar` $WINDOWS_ARGS

потому что я все равно вызываю вещи из оболочки cygwin. если вам нужно запустить скрипт из окна $ environment, см. http://cygwin.com/ml/cygwin/2004-07/msg00163.html

cygpath - это предлагаемый способ преобразования строк пути ... Я пришел на эту страницу, потому что хочу открыть объект File с жестко закодированным путем, который может быть символической ссылкой cygwin. все еще не уверены в этом ... запуск подпроцесса кажется экстремальным и требует, чтобы либо cygpath находился на вашем пути к windows, либо каталог cygwin находился в одном и том же месте на каждом компьютере.

0 голосов
/ 27 мая 2010

Какую версию Java вы используете? Это руководство по Java указывает, что NIO знает о ссылках на файловую систему, поэтому вы должны быть в курсе, пока вы используете Java1.4 или новее. Возможно, речь идет о nio2, и в этом случае попробуйте его с предварительной версией Java7 .

0 голосов
/ 27 мая 2010

Я не думаю, что есть простой ответ на это. Как утверждают различные страницы, Cygwin - это скорее набор приложений, чем ОС, а Sun не поддерживает Java в Cygwin.

Однако, может быть в состоянии собрать JDK 6 для Cygwin из исходного кода. Конечно, эта страница подразумевает, что это возможно. Есть ли у вас JDK, который понимает символические ссылки в стиле Cygwin, можно догадаться ...: -)

...