【问题标题】:Java console app running as a cron job having issue with relative path作为 cron 作业运行的 Java 控制台应用程序存在相对路径问题
【发布时间】:2016-03-12 02:24:15
【问题描述】:

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

以前,当我在 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权限。

【问题讨论】:

  • 为什么不用绝对路径?例如String fileName= "/root/data/foo.csv"
  • 也许是因为这是一种不好的方法?如果我移动程序,或重命名它所在的文件夹怎么办?
  • 你可以在你的代码中尝试类似的方法来获取绝对路径:stackoverflow.com/questions/320542/…
  • 我不推荐它,因为它太复杂了
  • 顺便说一句,绝对路径并不少见,如果您考虑一下,大多数已安装的程序都有绝对路径(例如在 linux ~/.config 文件夹中)

标签: java linux cron


【解决方案1】:

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

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

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

> crontab -e

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

【讨论】:

  • 太棒了!这帮助我解决了同样的问题
【解决方案2】:

在 Java 中,File 中有一个名为 separatorChar 的字段,这正是您构建独立于平台的文件名所需要的。还有一个名为separator的字段,它是同一事物的字符串版本。制作路径就像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 作业在哪里查找文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-07
    • 2012-05-12
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多