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

可执行jar打包是否会包含项目内添加的固件等资源文件?

问题1 原有路径逻辑与jar包资源包含性判断

  • 原有路径逻辑构建为executable jar后完全无法正常生效:你代码中写的"src\\com\\java\\myProgram\\data\\bios_fw\\"+biosFWPath+"\\"+biosFW"是指向项目源码目录的文件系统相对路径,仅在IDE的项目工作目录下运行时能匹配到对应文件。jar包运行时的默认工作目录是启动命令执行的终端目录,不存在源码层级的src文件夹,自然无法定位到目标固件。
  • 你构建出的jar包仅450MB,小于固件总大小650MB,说明固件未被打包进jar包。退一步说,即使你调整构建配置将固件打入jar包,原有路径逻辑依然无法生效:jar是压缩归档文件,内部资源没有独立的文件系统路径,不能通过File类直接访问,必须使用类路径资源读取API才能获取。

问题2 资源与jar共同部署的正确实现方式

针对大体积固件的场景,优先推荐外置资源部署方案,兼顾可维护性和运行效率,实现步骤如下:

  • 约定固定的部署目录结构,将固件文件夹与jar包放在同级目录,示例结构:
部署根目录/
├─ your_upload_tool.jar
└─ firmware/
   └─ bios_fw/
      ├─ [按业务分类的固件目录]/
      └─ ...
  • 调整代码的路径拼接逻辑,先自动获取jar包所在的目录,再拼接固件的相对路径,兼容Windows、Linux跨平台场景,示例代码:
import java.io.File;
import java.nio.file.Paths;

// 获取当前jar包所在的父目录
String jarParentDir = new File(YourMainClass.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getParent();
// 自动适配系统路径分隔符拼接固件完整路径
String fullFwPath = Paths.get(jarParentDir, "firmware", "bios_fw", biosFWPath, biosFW).toString();

如果确实需要将固件打包进jar包(不推荐600MB以上大体积资源使用该方案,会大幅提升jar启动时间和内存占用),需要先调整构建配置将src/com/java/myProgram/data标记为资源目录,构建时自动打入jar的类路径中,再通过类路径API读取资源:

// 路径以/开头表示从类路径根目录匹配
InputStream fwInputStream = YourMainClass.class.getResourceAsStream("/com/java/myProgram/data/bios_fw/" + biosFWPath + "/" + biosFW);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 00:36:08