目录
一、说明
场景:使用若依前后端分离打包部署到服务器上后,主包是ruoyi-admin.jar,如何写路径,才能找到从包下的ruoyi-remote-3.8.5.jar!/burn/burnhex/hex2bin.exe文件?
二、在 Java 代码中访问 jar 包中的资源文件
方法1 使用 ClassLoader 类来加载资源并返回其 URL
ClassLoader classLoader = getClass().getClassLoader();
//相对路径
URL resourceUrl = classLoader.getResource("burn/burnhex/hex2bin.exe");
//绝对路径
//URL resourceUrl = classLoader.getResource("/opt/ruoyi/lib/ruoyi-remote-3.8.5.jar!/burn/burnhex/hex2bin.exe");
String resourcePath = resourceUrl.getPath();
首先获取当前类的 ClassLoader
实例,使用 getResource()
方法加载 burn/burnhex/hex2bin.exe
资源,并返回其 URL。最后可以使用 getPath()
方法获取该资源在文件系统中的路径。
方法2 使用 ResourceUtils.getURL() 方法来获取资源文件的 URL
使用 ResourceUtils.getURL()
方法来获取资源文件的 URL,然后使用 FileUtils.getFile()
方法将其转换为文件对象。这将返回一个 File
对象。
URL url = ResourceUtils.getURL("classpath:burn/burnhex/hex2bin.exe");
File file = FileUtils.getFile(url);
方法3 使用 ClassLoader.getResourceAsStream()方法来加载资源文件
由于该文件位于 jar 包中,不能像操作文件系统中的文件一样直接访问它,需要使用类似于 getResourceAsStream()
的方法来读取 jar 包中的文件。可以使用 ClassLoader
类的 getResourceAsStream()
方法来获取 jar 包中的资源文件。使用以下代码来获取 burn/burnhex/cmd.bin
文件的 InputStream
对象:
InputStream inputStream = getClass().getClassLoader().getResourceAsStream("burn/burnhex/hex2bin.exe");
方法4 提取到系统临时文件夹中
如果需要在应用程序中频繁地访问 jar 包中的资源文件,那么最好将这些文件提取到文件系统中以提高性能。可以使用类似于以下代码的方法将文件提取到文件系统中:
File file = new File(System.getProperty("java.io.tmpdir"), "hex2bin.exe");
InputStream inputStream = getClass().getClassLoader().getResourceAsStream("burn/burnhex/hex2bin.exe");
Files.copy(inputStream, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
String exePath = file.getAbsolutePath();
- 创建一个
File
对象file
,该对象表示系统临时目录下的hex2bin.exe
文件。 - 从项目的
burn/burnhex
目录中获取hex2bin.exe
文件的输入流inputStream
。 - 使用
Files.copy
方法将inputStream
中的数据复制到file
对应的文件中。 - 如果
file
对应的文件已经存在,则使用StandardCopyOption.REPLACE_EXISTING
选项来覆盖原有的文件。 - 使用
file.getAbsolutePath()
方法获取复制后的hex2bin.exe
文件在系统中的绝对路径