可执行Java JAR无法找到文件路径

时间:2017-11-21 02:09:46

标签: java jar executable-jar

我在通过java -jar my.jar运行可执行.jar文件时遇到问题。我创建了一个项目,其中包含.sh路径下的src/main/resources/文件。在代码中,我将其称为执行:

Process pb = new ProcessBuilder("src/main/resources/stacktrace.sh",pid, traceFilePath,timeInMin).start();

当我从Intellij运行我的应用程序时它工作得很好但是当我将它导出到可执行jar文件并尝试运行时抱怨:

 Exception in thread "main" java.io.IOException: Cannot run program "src/main/resources/stacktrace.sh": error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)

1 个答案:

答案 0 :(得分:1)

您在"src/main/resources/stacktrace.sh"中使用的路径是相对于当前工作目录的。当您从源项目运行代码时,路径存在,但是当运行jar时,当前工作目录是不同的,因为您没有在源项目中运行它。因此,当您的代码尝试查找{{1}}时,它无法找到它。

例如,您的源项目可能位于:

/ myCodeProject

因此,当您运行项目时,您的路径将解析为:

/myCodeProject/src/main/resources/stacktrace.sh

当你运行你的jar时,你可能会从以下地方跑:

/选择/应用程序/对myApp

因此,您的路径将解析为:

/opt/app/myApp/src/main/resources/stacktrace.sh

并且这条路径不存在。

修改 根据要求,我正在添加一些关于如何纠正问题的想法。但是,您的要求并不清楚您希望文件存在的位置。它应该在罐子外吗?罐子里面?如果它在外面会位于特定的常量路径中还是相对于罐子?

  1. 有明显的解决办法:将文件放在预期的路径中,以便找到它。
  2. 另一个明显的修复:更改相对路径,使其指向文件实际所在的位置。
  3. 构建你的jar,使文件包含在jar中,并使用one of these methods来访问它。请注意,您可能无法直接运行该文件,但您可以阅读其内容并生成外部临时文件并运行该文件。