2010-05-27 37 views
1

這裏是一個非常簡單的Java程序來打印文件的第一行:如何獲取Java承認在cygwin下符號鏈接

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來跟隨符號鏈接?我希望比自己實現重定向更簡單。

+0

我戳了一圈,發現了一個名爲路口(http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx)工具,我用來做Windows下的快捷方式(而不是LN -s以上)。這似乎解決了這個問題。 – 2010-05-27 18:09:25

回答

0

我不認爲這是一個簡單的答案。正如各種頁面所述,Cygwin是一個應用程序套件而不是操作系統,Sun不支持Cygwin上的Java。

但是,它可能可能可能從源代碼爲Cygwin構建JDK 6。當然,this page暗示這是可能的。無論這給你一個理解Cygwin樣式符號鏈接的JDK,任何人都會猜測...... :-)

0

你正在使用什麼版本的Java? This Java Tutorial表示NIO知道文件系統鏈接,所以只要你是Java1.4或更高版本,你就應該是Aok。它可能是它實際上是nio2它在談論,在這種情況下嘗試與Java7預發佈。

+0

這是1.6.0_20,HotSpot虛擬機。他們推薦的包(java.nio.file)在Java7之前不存在。我不認爲我還想去Java7。 – 2010-05-27 06:04:45

1

我有這個問題了,所以我寫了一個外殼包裝,包括像

# 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的東西反正殼。如果你需要開始從窗口$環境的腳本,看到http://cygwin.com/ml/cygwin/2004-07/msg00163.html

cygpath是轉換路徑字符串的建議的方式......我來到這個頁面,因爲我想開一個File對象與硬編碼路徑可能成爲一個cygwin符號鏈接。仍然不確定這個......運行一個子進程似乎極端,需要cygpath在你的Windows路徑或cygwin目錄在每臺計算機上的相同位置。

+0

在我看來最好的答案。我已經根據你製作了一個類似的腳本。它不會假定'-jar'選項,並且對於包含空格的參數沒有問題。 – artistoex 2012-11-13 18:09:17

+0

這隻適用於在命令行中指定的文件名。如果程序構造一個文件名,或從其他地方讀取文件名,然後嘗試打開它,它仍然會讀取鏈接的內容而不是鏈接文件。 – 2013-01-16 20:25:08

2

我愛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 "[email protected]" 
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[@]}"