这是一个非常简单的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遵循符号链接?我希望有一些比我自己实现重定向更简单。
答案 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预发布。