从 maven junit 内的依赖项 jar 加载文件

发布于 2024-10-06 13:36:21 字数 799 浏览 3 评论 0原文

我正在使用 maven 2.1.0 并且有一个包含多个模块的项目。 示例模块:

  • spr-resources
  • spr-common

spr-common 依赖于 spr-resources

spr-resources 仅包含文件,不包含类。

spr-common 有一个 junit,需要从 spr-resources jar 加载文件。

我使用:

String fileName = getClass().getResource("/jaskeyfile.3DES").getFile();
is = getClass().getClassLoader().getResourceAsStream(fileName);
is.read(data);

当我在 IntelliJ 中运行测试时,这有效,但是当我进行 mvn 测试时,当我尝试对其执行 read() 时,它会失败并出现 NullPointerException 。

为什么会发生这种情况?它应该可以很好地从依赖项中读取文件。

另外,spr-common 中的 pom.xml 依赖于 spr-resources(尝试使用范围测试和不使用范围测试)

编辑: 我也尝试过

getClass().getClassLoader().getResourceAsStream("/jaskeyfile.3DES");

但没有运气。

编辑2: 给定的文件存在于生成的 jar 中,所以我想它应该可以访问。

I'm using maven 2.1.0 and have a project with multiple modules.
Example modules:

  • spr-resources
  • spr-common

spr-common has a dependency on spr-resources

spr-resources contains only files, no classes.

spr-common has a junit in which needs to load a file from spr-resources jar.

I used:

String fileName = getClass().getResource("/jaskeyfile.3DES").getFile();
is = getClass().getClassLoader().getResourceAsStream(fileName);
is.read(data);

And this works when I run the test in IntelliJ, but when I do mvn test, it fails with NullPointerException when I try to do read() on it.

Why is this happening? It should read a file from dependency just fine.

Also, pom.xml in spr-common has dependency on spr-resources (tried both with scope test and without it)

EDIT:
I tried also

getClass().getClassLoader().getResourceAsStream("/jaskeyfile.3DES");

with no luck.

EDIT2:
The given file exists in the resulting jar, so I guess it should be accessible.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

Smile简单爱 2024-10-13 13:36:21

仔细检查所有内容

这里有一个需要处理的列表:

  1. 文件 jaskeyfile.3DES 位于 spr-resources 模块内的 src/main/resources
  2. 您的本地存储库包含最新版本的 spr-resources-xyz-SNAPSHOT.jar (或者您已直接发布它/对其进行版本控制)并且您肯定已经在其上使用了 mvn clean install
  3. spr-common 模块引用了正确的( spr-resources-xyzjar 的命名)版本(编译范围将在测试和编译类路径上看到)

如果上述所有条件均为 true,则您的 getClass().getResourceAsStream("/jaskeyfile.3DES") 调用应该有效。我在我的项目中一直使用这种结构,所以你在这里不需要月亮或任何东西。

Check everything carefully

Here's a list to work through:

  1. The file jaskeyfile.3DES is located in src/main/resources within the spr-resources module
  2. Your local repository contains the latest version of spr-resources-x.y.z-SNAPSHOT.jar (or you've released it/versioned it directly) and you've definitely used mvn clean install on it
  3. The spr-common module is referencing the correct (named) version of spr-resources-x.y.z.jar (scope of compile will be seen on both test and compile classpaths)

If all the above are true then your getClass().getResourceAsStream("/jaskeyfile.3DES") invocation should work. I use this structure all the time in my projects so you're not asking for the moon or anything here.

凑诗 2024-10-13 13:36:21

我相信问题可能出在前导斜杠上。我认为这两个都应该有效:

  • getClass().getResourceAsStream("/jaskeyfile.3DES")
  • getClass().getClassLoader().getResourceAsStream("jaskeyfile.3DES")

Class.getResourceAsStream() 采用相对于类的包目录的路径,因此它接受前导斜杠。

ClassLoader.getResourceAsStream() 已经采用绝对路径,因此它不接受前导斜杠。

I believe the issue may be with the leading slash. I think both of these should work:

  • getClass().getResourceAsStream("/jaskeyfile.3DES")
  • getClass().getClassLoader().getResourceAsStream("jaskeyfile.3DES")

Class.getResourceAsStream() takes a path relative to the class's package directory so it accepts the leading slash.

ClassLoader.getResourceAsStream() takes an absolute path already so it doesn't accept the leading slash.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文