【问题标题】:Run an executable jar运行可执行jar
【发布时间】:2020-10-15 17:14:57
【问题描述】:

我在 Eclipse 中有一个 Maven 项目。在 src/main/resources 下,我有一个名为“directoryToCopy”的目录,其中包含文件。 运行项目后,我想将“directoryToCopy”复制到桌面的本地目录“localDirec”下。

我用过这个:

File localDirec = new File("c:/desktop/scripts");
URI urlDir = ClassLoader.getSystemResource("directoryToCopy").toURI();
File srcDir = new File(urlDir.getPath());
FileUtils.copyDirectory(srcDir, localDirec);

这在本地运行良好,但是当我想将它作为可执行 jar 文件运行时,我得到 NullPointerException

Exception in thread "main" java.lang.NullPointerException
        at java.base/java.io.File.<init>(File.java:278)

有什么建议吗?

【问题讨论】:

  • 你有没有试过打开你的 jar 看看 directoryToCopy 是否仍然在 src/main/resources 下?如果它在 IDE 中工作,那么在构建你的 jar 时可能会出现一些错误
  • 当我打开我的jar时,我直接在它下面找到了我的文件directoryToCopy。可执行jar下没有src/main/resources
  • 你可能想看这个,stackoverflow.com/a/13292358/10416835
  • getClass().getResource() 和 getClass().getClassLoader().getResource() 都试过了,同样的问题,nullPointerException

标签: java jar executable-jar


【解决方案1】:

你总是可以的,尝试打印路径

System.out.println(getClass().getResource(getClass().getSimpleName() + ".class"));

类的getResource() - 文档说明了区别:

"此方法将调用委托给其类加载器,在对资源名称进行以下更改后:如果资源名称以“/”开头,则保持不变;否则,包名称为将 "." 转换为 "/" 后添加到资源名称前。如果此对象由引导加载程序加载,则调用委托给 ClassLoader.getSystemResource。"

当路径不应该改变时使用/,尝试打印加载的路径,它会清楚。

【讨论】:

  • 我尝试打印路径:对于 URI:jar:file:/C:/Users/Myproject/target/Myproject-0.0.1-jar-with-dependencies.jar!/directoryToCopy,但我无法打印文件路径,因为在那里我得到了空指针异常。
  • 你试过getClass().getClassLoader().getResource(/directoryToCopy)吗??
  • 是的,我添加了 /directoryToCopy 但我在打印中得到了 null,我尝试了 Myclass.class.getClassLoader().getResource(directoryToCopy) 它为我提供了 ClassLoader.getSystemResource(directoryToCopy) 的确切路径
猜你喜欢
  • 1970-01-01
  • 2013-02-05
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多