【问题标题】:Reading a resource file from within compiled jar从已编译的 jar 中读取资源文件
【发布时间】:2017-05-16 07:10:21
【问题描述】:

我有以下问题。 我的项目结构是一个典型的 maven Java 项目:

src/main/java - project .java files      
src/main/resources - project resources (log4j2.xml)
src/test/java - .java files for tests
src/test/resources - testng.xml file

在 src/main/java 中,我还有一个包含 JavaScript 文件(我在 Java 代码中以编程方式执行的一些脚本)的包,位于以下位置:src/main/java/js/scripts/

当我运行测试时,我当然可以访问“脚本”文件夹中的 *.js 文件 - 我只是使用 FileUtils.readFileToString(new File(pathTo_jsFile))

但是在使用 maven 编译项目后,这不再起作用。

  1. 我无法使用要放置在现有包 (/js/scripts/) 中的文件进行编译 - 我能够将非 java 文件添加到 .jar 的唯一方法是添加它们作为 pom.xml 中的资源,但随后它们被添加到 .jar 文件的根目录中。

  2. 我无法从 .jar 文件中读取任何内容。

【问题讨论】:

  • 要读取 .jar,请参阅 How to add and read resource file from jar
  • 对不起,我应该提到我已经尝试过的事情。我已经测试了 getResourceAsStream() 并且它给出了一个空值。我读过这个方法只能从项目类文件中读取,不能从编译的.jar中读取
  • 你看错了...
  • 是的,如果找不到资源,它可以返回 null,但它肯定会从 .jar 中读取。最有可能的是,资源的路径指定不正确。资源也可能不在 .jar 中。
  • @Sergio:你试过Class.getResourceAsStream() 还是ClassLoader.getResourceAsStream()?如果您需要前导 / (Class) 或不需要 (ClassLoader) 来指定 JAR 中的绝对路径,则行为会有所不同。

标签: javascript java maven selenium jar


【解决方案1】:

首先,您应该将 JavaScript 文件放入 src/main/resources 文件夹。在那里,它们应该由 maven 打包到 .jar 文件中,而无需 maven 进行任何特殊处理。您可以将文件夹结构保留在资源文件夹中。

其次,您可以借助 ClassLoader 访问 Java 中的资源:

getClass().getClassLoader().getResourceAsStream("js/scripts/myScriptfile.js");

这应该让您将 javascript 文件作为输入流。如果您更喜欢该文件的 URL(是的,当它包含在 JAR 文件中时也可以使用),只需使用 getResource(...) 而不是 getResourceAsStream(...)

【讨论】:

  • 我试过getClass().getClassLoader().getResourceAsStream,但它没有从.jar中读取。
  • 您是否打开了 .jar 文件(使用任何可以读取 ZIP 文件的工具)并检查文件是否在其中?下一步:您必须在 JAR 文件中指定正确的(相对)路径!
  • 是的,我可以看到文件在里面,路径也正确(尝试读取指向 jar 的路径时还有一个“!”符号,我也尝试过从字符串中删除它),但它仍然给出空指针。
  • 只是为了交叉检查:.getResourceAsStream() 方法是否有效,当您的代码没有放入 JAR 但在磁盘上“爆炸”运行时?仅供参考:!在路径中对于 JAR 中的文件路径是正确的。不要删除它。
  • getClass().getClassLoader().getResourceAsStream 是完成您正在寻找的东西的标准方法;但是,有时您需要小心使用哪个类加载器(取决于您的设置)。所以也许试试Thread.currentThread().getContextClassLoader()
猜你喜欢
  • 2021-11-21
相关资源
最近更新 更多