与 IntelliJ 中的 运行 应用程序和 运行 JAR 文件的区别

Difference from running application in IntellJ and running JAR file

我遇到过这样一种情况,当我在 intellJ 中 运行 应用程序并且一切顺利 运行 时,我会使用 maven install 命令创建一个 jar 并尝试 运行ning 它从命令行手动执行,结果如下:

命令行

java.lang.RuntimeException: java.io.FileNotFoundException: api\src\main\resources\FAQ.pdf (The system cannot find the path specified)
        at test.test.paisy.test.test.domain.email.FaqAttachment.pdfToBytes(FaqAttachment.java:27) ~[classes!/:0.0.1-SNAPSHOT]

问题:

  1. 运行ning Jar 和 运行ning App 有什么区别 IntelliJ
  2. 为什么找到文件路径后会报错 运行在 ItelliJ
  3. 中成功

文件路径

try (FileInputStream inputStream = new FileInputStream(new File("api/src/main/resources/FAQ.pdf"))) {
                this.bytes = ByteStreams.toByteArray(inputStream);

谢谢

首先,如果要使用相对路径,需要从src文件夹开始,像这样

new File("src/main/resources/FAQ.pdf")

但最好的方法是使用

InputStream inputStream = ClassName.class.getClassLoader().getResourceAsStream("FAQ.pdf"); 

这样路径就不会相对于该静态路径。

不要忘记将 ClassName 替换为您当前 class

的名称

确保在 运行.

之前清理构建然后重建

有关详细信息,请查看此

好吧,首先在这段代码中 new File("api/src/main/resources/FAQ.pdf") 你有相对路径。所以它取决于 属性 System.getProperty("user.dir") 并基于此 属性.

形成绝对路径

当您 运行 jar 文件时,此 属性 设置为您的当前目录 例如你有目录结构

root
  dir1
  dir2
    java-file.jar

cd /root/dir1

java -jar ../dir2/jar-file.jar - 那么你的 user.dir = /root/dir1 和你的文件将在 /root/dir1/api/src/main/resources/FAQ.pdf

在Idea中你可以在运行配置中指定工作目录。

从资源目录获取数据的更好方法是做这样的事情 YourClassName.class.getClassLoader().getResourceAsStream(("FAQ.pdf")