【问题标题】:JAR, when runs, looks for resource files inside the JAR (itselfe) or outside?JAR 在运行时会在 JAR(自身)内部还是外部查找资源文件?
【发布时间】:2015-07-17 05:42:56
【问题描述】:

Java 程序使用不同的文件,存储在路径“src/main/resources/files/files.drl”下。 如果我将此程序导出为可运行的 JAR 并运行此 JAR,它会在 JAR 中查找这些文件还是在文件夹 src->main->resources->files 中查找这些文件?

Java程序如何使用这些文件的示例代码是:

drlFileName = "./src/main/resources/files/files.drl";
FileInputStream fis = null;
fis = new FileInputStream(drlFileName);
kbuilder.add( ResourceFactory.newInputStreamResource(fis), ResourceType.DRL);   

【问题讨论】:

  • 通过使用 FileInputStream 您要求使用相对于工作目录的./src/main/resources/files/files.drl。要从类路径资源(来自 JAR)加载它,请改为使用 this.getClass().getResourceAsStream("/files/files.drl")

标签: java jar


【解决方案1】:

在大多数情况下,您如何打包您的应用程序并不能确定它在哪里可以找到它的资源。它会在您告诉它查找的任何目录中查找。如果您指定一个 jar 文件,通过使用各种 jar 文件 API(例如 java.util.jar.JarFile),那么您的程序将在其中找到它的数据。如果您查看操作系统的文件系统(例如使用java.io.FileInputStream 之类的东西),那么它将在其中找到其数据。

例外情况是当您使用ClassLoader::getResource 时,它将搜索您的类路径以找到指定的资源。因此,例如,如果您的类路径指向单个 jar 文件,则只会在该 jar 文件中查找资源。请注意,如果您使用自定义 ClassLoader 实现,则可以搜索其他地方——URL、非类路径路径/jarfile 等。基本上任何可能的字节源都可以被自定义 ClassLoader 用来查找资源——这将取决于ClassLoader 的设计目的是什么。

【讨论】:

  • 我正在使用这个代码:`ClassLoader classLoader = getClass().getClassLoader();文件文件 = 新文件 (classLoader.getResource(drlFileName).getFile());`
  • 看看里面还是外面。
  • 啊,我明白了——类加载器使用类路径,所以它们最终成为我提到的经验法则的例外。资源将在类路径中查找,并且可能来自文件系统或 jar,具体取决于类加载器首先找到指定资源的位置。
  • 所以基本上,类加载器可以通过两种方式找到它们。 (里面还是外面)?
  • 是的 - 这一切都与类路径有关。请参阅我刚刚对我的答案所做的更新。
猜你喜欢
  • 2012-08-11
  • 2011-09-18
  • 1970-01-01
  • 2018-02-23
  • 2013-12-08
  • 2015-10-15
  • 2012-04-14
  • 2013-06-08
相关资源
最近更新 更多