如何让java识别cygwin下的符号链接

时间:2010-05-27 00:13:09

标签: java cygwin symlink

这是一个非常简单的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 个答案:

答案 0 :(得分:2)

我也有这个问题,所以我写了一个shell包装器,其中包含类似

的内容
# 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 shell中调用一些东西。如果您需要从窗口$环境启动脚本,请参阅http://cygwin.com/ml/cygwin/2004-07/msg00163.html

cygpath是建议的转换路径字符串的方法...我到达此页面是因为我想打开一个带有硬编码路径的File对象,该路径可能是一个cygwin符号链接。仍然不确定那个...运行一个子进程似乎极端,要求cygpath在你的Windows路径或cygwin目录在每台计算机上的相同位置。

答案 1 :(得分: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 "$@"
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 :(得分:0)

我认为没有一个简单的答案。正如各种页面所述,Cygwin是一个应用程序套件而不是操作系统,Sun不支持Cygwin上的Java。

但是,可能可以从源代码为Cygwin构建JDK 6。当然,this page暗示它是可能的。这是否给你一个理解Cygwin风格符号链接的JDK是任何人猜测......: - )

答案 3 :(得分:0)

您使用的是哪个版本的Java? This Java Tutorial表示NIO知道文件系统链接,所以只要你是Java1.4或更高版本,你就应该感到很沮丧。它可能是它正在谈论的实际上是nio2,在这种情况下尝试Java7预发布。