作为具有相对路径问题的cron作业运行的Java控制台应用程序

时间:2015-12-07 13:06:08

标签: java linux cron

在我的java程序中,我试图将.csv文件保存到位于与主jar文件相同的文件夹中的 data 文件夹中。

以前,当我以前在Windows机器上运行我的程序时,我的相对路径是:data\\foo.csv。当我在Linux上尝试相同的操作时,它在根目录中创建并保存了名为data\\foo.csv的文件。

然后我尝试将路径设置为data/foo.csv,我收到此错误:

java.io.FileNotFoundException: data/04-12-2015.csv (No such file or directory)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at java.io.FileWriter.<init>(Unknown Source)
    at main.Main.saveResultsToFile(Main.java:121)
    at main.Main.main(Main.java:92)

我已将目录的权限设置为777(授予所有人所有权限)。

负责创建和保存文件的代码:

String fileName = "data/foo.csv"
BufferedWriter bw = new BufferedWriter(new FileWriter(fileName));

编辑:

如果更改了任何内容,则权限不是递归的。只有data文件夹具有777权限。

2 个答案:

答案 0 :(得分:1)

在Java中,File中有一个名为separatorChar的字段,它正是您构建与平台无关的文件名所需要的。还有一个名为separator的字段,它是同一个字符串的String版本。制作路径就像String fileName = "data" + File.separator + "foo.csv" ;

由于错误是找不到文件而不是有关权限的投诉,因此权限不是问题。大概那么你要么试图打开一个不存在的文件,要么你没有把文件放在cron所期望的地方。

尝试以下方法:

File f = new File( "data" + File.separator + "foo.csv" ) ;

System.err.println( "Path being used is : " + f.getCanonicalPath() ) ;

这应该报告从相对路径名中使用的已解析路径名。它至少应该告诉您cron作业正在查找文件的位置。

答案 1 :(得分:0)

我今天遇到了同样的问题,帖子虽然很旧,但是人们可能会在这里结束:

问题是crontab从根目录运行,因此相对路径从根(/)开始并获得空点异常。在cronjob上,您可以在命令前加上 cd $ jar.directory

假设您的jar文件位于/ home / project / data中,并希望您每晚运行:

> crontab -e

> 0 0 * * *  cd /home/project/data && /usr/bin/java -jar program.jar >> log.txt 2>&1