欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > java打包jar后读取依赖jar包中的文件资源,支持读取jlink打包的模块镜像中读取

java打包jar后读取依赖jar包中的文件资源,支持读取jlink打包的模块镜像中读取

2024/10/25 0:32:24 来源:https://blog.csdn.net/Janix520/article/details/141676539  浏览:    关键词:java打包jar后读取依赖jar包中的文件资源,支持读取jlink打包的模块镜像中读取

java项目通常会打包成jar,jar里面依赖第三方的jar,那如何在我们的程序中读取第三方jar中的资源呢,当然还有一种情况,是从新版jdk通过jlink打包生成的镜像中获取第三方资源

这里提供两种打包方式的获取方法

  1. 普通打包的jar,例如springboot的jar
  2. 模块化打包的程序,例如jlink打包的镜像
		try {//普通jar包中获取//jar:file:///jar包具体位置!/包中资源具体位置
//			URL url = new URL("jar:file:///D:/maven/repository/org/bytedeco/ffmpeg/6.1.1-1.5.10/ffmpeg-6.1.1-1.5.10-windows-x86_64-gpl.jar!/org/bytedeco/ffmpeg/windows-x86_64-gpl/ffmpeg.exe");//模块化中获取//jrt:/模块名/包中资源具体位置URL url = new URL("jrt:/org.bytedeco.ffmpeg.windows.x86_64.gpl/org/bytedeco/ffmpeg/windows-x86_64-gpl/ffmpeg.exe");InputStream openStream = url.openStream();System.out.println(openStream.available());} catch (java.lang.Exception e) {e.printStackTrace();}

模块化打包获取第三方jar中资源的另外一种方式

新的jdk支持模块化打包,此时是以jrt协议访问的,同时jdk新增了FileSystem类,可以用来访问第三方jar中的资源

		FileSystem fs = FileSystems.getFileSystem(URI.create("jrt:/"));//fs.getPath("modules/模块名", "包中资源具体的位置");Path imagePath = fs.getPath("modules/org.bytedeco.ffmpeg.windows.x86_64.gpl", "org/bytedeco/ffmpeg/windows-x86_64-gpl/ffmpeg.exe");byte[] bytes = null;try {bytes = Files.readAllBytes(imagePath);} catch (IOException e) {e.printStackTrace();}System.out.println(bytes.length);

通用获取资源方法

try {String jarPathName = "ffmpeg-6.1.1-1.5.10-windows-x86_64-gpl";String jrtModuleName = "org.bytedeco.ffmpeg.windows.x86_64.gpl";ClassLoader systemClassLoader = App.class.getClassLoader();Enumeration<URL> systemResources = systemClassLoader.getResources("META-INF/MANIFEST.MF");Iterator<URL> iterator = systemResources.asIterator();while (iterator.hasNext()) {URL next = iterator.next();String path = next.toString();//ffmpeg-6.1.1-1.5.10-windows-x86_64-gpl是普通jar的路径格式,直接以文件名表示//org.bytedeco.ffmpeg.windows.x86_64.gpl是jlink打包镜像中以jrt:协议的路径格式,他其实是路径中的模块名//通过动态获取App的所有类和第三方依赖jar,进行过滤,再进行拼接第三方jar中资源的具体路径if (path.indexOf(jarPathName) >= 0 || path.indexOf(jrtModuleName) >= 0) {String replace = path.replace("META-INF/MANIFEST.MF", "");//jar:file:///jar包具体位置!/包中资源具体位置//jrt:/模块名/包中资源具体位置replace = replace + "org/bytedeco/ffmpeg/windows-x86_64-gpl/ffmpeg.exe";System.out.println(replace);URL url = new URL(replace);InputStream openStream = url.openStream();System.out.println("ffmpeg:"+openStream.available());}}} catch (java.lang.Exception e) {e.printStackTrace();}

通过Main方法类的getClassLoader可以获取当前程序所有依赖类和第三方jar,然后通过过滤得到路径,就能获取jar包或者jlink模块镜像中的资源了

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com