You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询从Artifacts Jar包中获取媒体文件的正确资源路径

我来帮你理清这个Jar包内资源加载的问题~

首先先明确你的项目结构:

ProjectOne
├─ Out
│  └─ production
│     └─ artifacts
│        └─ jar
├─ src
│  └─ pack1
│     ├─ Test.java
│     └─ vid1.mp4

先说说为什么IDE里那三种方式都能正常运行:

  • 前两种用getClass().getResource()的方式,IDE编译时会把src/pack1下的vid1.mp4复制到编译输出目录,所以在IDE环境中,类路径下能直接找到这个资源。带/的是从类路径根目录查找,不带的是相对于当前类(Test.java所在的pack1包)查找,所以都能命中目标文件。
  • 第三种直接用new File("src/vid1.mp4")能跑,是因为IDE运行时的工作目录是项目根目录,这个相对路径能定位到源码目录里的原文件,但这种方式在Jar包中完全失效——Jar里根本没有src这个目录结构。

Jar包中加载vid1.mp4的正确方式

当你打包成Artifacts Jar后,vid1.mp4会被放在Jar包内的pack1目录下(和编译后的Test.class同目录)。这时候绝对不能用File类来读取,因为File只能访问文件系统中的独立文件,而Jar内的资源是Jar包的内部条目,不是单独的文件实体。

正确的做法是直接通过类加载器获取资源URL,传给Media即可,不需要转成File路径:

// 推荐:相对于当前类的包路径(因为Test和vid1.mp4在同一个包下)
mediaPlayer = new MediaPlayer(new Media(getClass().getResource("vid1.mp4").toString()));

// 另一种方式:使用绝对类路径(开头的/表示从类路径根目录开始,要带上完整包路径)
mediaPlayer = new MediaPlayer(new Media(getClass().getResource("/pack1/vid1.mp4").toString()));

为什么这两种方式可行?因为getClass().getResource()在Jar环境下会返回类似jar:file:/xxx/your-artifact.jar!/pack1/vid1.mp4的URL,而Media类支持直接加载这种Jar内部的资源URL,不需要你手动处理File转换。

避坑提醒

  • 别再尝试把Jar内资源转成File对象,这在Jar环境下必然报错,因为Jar里的资源不是文件系统中的实体文件。
  • 如果你用ClassLoader.getResource()(而不是getClass().getResource()),注意它的路径默认是从类路径根开始的,不需要加开头的/,比如getClass().getClassLoader().getResource("pack1/vid1.mp4")也可以正常工作。

内容的提问来源于stack exchange,提问作者Mohd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:22:56