在嵌套 JAR 内的文件夹中查找文件名

2023-12-13

当我的应用程序打包为 JAR 时,我无法访问目标文件夹“images”。 我不是在获取单个文件后,我想要的是“images”文件夹中所有 .jpg 文件的列表。

我试过这个:URI uri = getClass().getClassLoader.getResource("images").toURI();

这将返回:jar:file:/C:/test-1.0-SNAPSHOT.jar!/BOOT-INF/lib/core-1.0-SNAPSHOT.jar!/images

然后我尝试创建一个流来迭代文件,如下所示:

FileSystem fs = FileSystems.newFilesSystem(uri, Collections.emptyMap());
Path p = fs.getPath("images");
Files.walk(p).forEach(path -> System.out.println(path));

这只会给 med 一个 FileNotFoundException。

那么,如何访问嵌套 JAR 中的“images”文件夹?

编辑:这不是重复的:如何列出 JAR 文件中的文件?。我已经尝试了那里的一切。不同之处在于我有一个 JAR 位于另一个 JAR 中,即嵌套 JAR。我认为这就是造成问题的原因。


在 JDK 12 之前,内置中不支持嵌套 jar 文件ZipFileSystem at all.

例如,newFileSystem的方法ZipFileSystemProvider接受一个Path有这样的声明

if (path.getFileSystem() != FileSystems.getDefault()) {
    throw new UnsupportedOperationException();
}

即使对于 JDK 12,由于一贯的虐待,掌握嵌套 zip 文件系统也不是一件容易的事jar: URLs.

语法为jar: URLs 已指定 as:

jar:<url>!/{entry}

这意味着您的资源的正确 URL 是

outer file                file:/C:/test-1.0-SNAPSHOT.jar
nested jar file       jar:file:/C:/test-1.0-SNAPSHOT.jar!/BOOT-INF/lib/core-1.0-SNAPSHOT.jar
entry of nested   jar:jar:file:/C:/test-1.0-SNAPSHOT.jar!/BOOT-INF/lib/core-1.0-SNAPSHOT.jar!/images

要解析这样的 URL,您必须使用第一个 URL 之间的部分来提取 jar 文件的位置jar:和最后一个!/并递归地解析它。 然而,我见过的所有 JDK 代码,无论是否支持URLAPI 或FileSystemAPI 始终无法做到这一点,使用indexOf("!/")而不是lastIndexOf("!/")。 如此嵌套jar:URI/URL 根本不起作用。

获得嵌套文件系统的唯一方法是使用以下命令打开它们Path实例已与某个关联FileSystem:

Path outer = Paths.get("C:", "test-1.0-SNAPSHOT.jar");
ClassLoader cl = null;
try(FileSystem outerFs = FileSystems.newFileSystem(outer, cl);
    FileSystem innerFs = FileSystems.newFileSystem(
        outerFs.getPath("/BOOT-INF/lib/core-1.0-SNAPSHOT.jar"), cl) ) {

    Path p = innerFs.getPath("images");
    Files.walk(p).forEach(path -> System.out.println(path));
}

这适用于 JDK12 或更高版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在嵌套 JAR 内的文件夹中查找文件名 的相关文章

  • 抽象超类的默认接口方法

    可以说我有以下结构 abstract class A abstract boolean foo interface B default boolean foo return doBlah class C extends A implemen
  • 带有来自 Selenium 2 / WebDriver 的 Id 的 jQuery 元素选择器

    我可以在 Selenium 中获取元素的 ID RemoteWebElement webElement getId 它返回一个像这样的字符串 e9b6a1cc bb6f 4740 b9cb b83c1569d96d 我想知道这个ID的来源
  • 不同的 JDK 更新会产生不同的 Java 字节码吗?

    假设场景 我有一个项目 其源合规性级别指定为 1 5 现在 我使用两种不同的 JDK 编译此项目 首先使用 JDK 6 Update 7 然后使用 JDK 6 Update 20 这两个不同的 JDK 是否会生成不同的 Java 字节代码
  • 使用 Spring MVC 返回 PDF 文件

    实际上 我有这个功能 我有一个框架 可以在其中设置 URL ip port birt preview report report rptdesign format pdf parameters 并且该框架呈现 PDF 文件 但我想隐藏该网址
  • 如何将列表转换为地图?

    最近我和一位同事讨论了转换的最佳方式是什么List to Map在 Java 中 这样做是否有任何具体的好处 我想知道最佳的转换方法 如果有人可以指导我 我将非常感激 这是个好方法吗 List
  • 将 JSON Map 传递到 Spring MVC 控制器

    我正在尝试将 Map 的 JSON 表示形式作为 POST 参数发送到我的控制器中 RequestMapping value search do method RequestMethod GET consumes application j
  • 在 Java 中填充布尔数组

    作为一名相当新手的 Java 程序员 我给自己设定了一个艰巨的挑战 尝试编写一个简单的文本冒险 不出所料 我已经遇到了困难 我试图为我的 Location 类提供一个属性来存储它包含的退出 我为此使用了一个布尔数组 本质上保存代表每个出口的
  • DateTimeFormatter.parseLocalDate 抛出 UnsupportedOperationException

    该API用于解析本地日期 http joda time sourceforge net apidocs org joda time format DateTimeFormatter html parseLocalDate 28java la
  • JSON 对象数组转 Java POJO

    将此 JSON 对象转换为 java 中的类 您的 POJO 类中的映射将如何 ownerName Robert pets name Kitty name Rex name Jake This kind of question is ver
  • 将多个视频文件合并到一个文件中

    我有多个以相同帧速率和分辨率录制的视频 我想将两个视频合并为一个视频 因此结果文件将是大视频 我正在使用 MP4 解析器 api 并使用下面的代码 Movie countVideo new MovieCreator build Channe
  • 在 JavaFX 中拖动未装饰的舞台

    我希望将舞台设置为 未装饰 使其可拖动且可最小化 问题是我找不到这样做的方法 因为我遇到的示例是通过插入到主方法中的方法来实现的 我想通过控制器类中声明的方法来完成此操作 就像我如何使用下面的 WindowClose 方法来完成此操作 这是
  • perl 和 java 正则表达式功能之间有什么区别?

    perl 和 java 在支持哪些正则表达式术语方面有什么区别 这个问题仅涉及正则表达式 并且特别排除了how可以使用正则表达式 即使用正则表达式的可用函数 方法 以及语言之间的语法差异 例如java要求转义反斜杠等 特别令人感兴趣的是 j
  • 在Spring-Boot中,我们如何在同一个项目中连接两个数据库(Mysql数据库和MongoDB)?

    我正在尝试创建一个 Spring Boot 项目 其中我有一个要求 我想连接到不同的数据库 MySql 和 MongoDB 我是否需要做一些特殊的事情来连接到这两个数据库 或者 spring boot 会自动计算出自己连接到这两个数据库 我
  • java 1.8下无法启动eclipse

    java 1 8 升级后我无法启动 eclipse 附上错误截图 这是我的 eclipse 配置设置 我该如何解决 startup plugins org eclipse equinox launcher 1 3 0 v20120522 1
  • 我可以关闭并重新打开套接字吗?

    我学习了一个使用套接字的例子 在此示例中 客户端向服务器发送请求以打开套接字 然后服务器 侦听特定端口 打开套接字 一切都很好 套接字从双方 客户端和服务器 打开 但我仍然不清楚这个东西有多灵活 例如 客户端是否可以关闭一个打开的 从两端
  • 链表中的虚拟节点

    问 什么时候使用它们 作业问题 列表中的第一个和最后一个节点 有时用作列表中的第一个和最后一个节点 从未用作列表中的第一个和最后一个节点 维基百科说 哨兵节点是与链接一起使用的专门指定的节点 列表和树作为遍历路径终止符 哨兵节点的作用是 不
  • Java 相当于 Python 的 urllib.urlencode(基于 HashMap 的 UrlEncode)

    From https stackoverflow com questions 2018026 should i use urllib or urllib2 2018103 2018103 Java 中 Python 的 urllib url
  • JSP 和 scriptlet

    我知道现在使用 scriptlet 被认为是禁忌 没关系 我会同意Top Star的话 因为我目前只是Java新手 到目前为止我听到的是 它是为了让设计师的生活更轻松 但我想知道 这是否与JSP页面的性能有关 另一方面 如果只是为了 让设计
  • 如何在 Servlet 中打开弹出窗口,然后重定向页面

    我想在调用 servlet 时打开一个弹出窗口 然后想将 servlet 重定向到某个 jsp page 这就是我所做的 protected void doGet HttpServletRequest request HttpServlet
  • Java,如何管理线程读取socket(websocket)?

    我有一个 WebSocket 服务器 我的服务器创建一个新线程来处理新连接 该线程一直处于活动状态 直到 websocket 中断 我的问题 对于 1 000 000 个连接 我需要 1 000 000 个线程 我如何通过一个线程处理多个

随机推荐

  • 使用enable_if选择类构造函数[重复]

    这个问题在这里已经有答案了 考虑以下代码 include
  • 如何制作可折叠丝带?

    我正在寻找一种对可折叠丝带进行编程的方法 所以我这里有这段代码 ribbon position absolute top 20px right 0 padding 15px ribbon content position relative
  • 使用 Selenium 访问 Shadow DOM 树

    是否可以使用 Selenium Chrome webdriver 访问 Shadow DOM 中的元素 正如预期的那样 使用普通的元素搜索方法不起作用 我已经看到了对切换到子树w3c 上的规范 但找不到任何实际的文档 示例等 有人在这方面取
  • Networkx:绘制平行边

    使用以下代码从数据框中绘制图表 import pandas as pd import networkx as nx df pd DataFrame id emp 13524791000109 12053850000137 470782100
  • 禁用所有移动设备中的滚动

    这听起来好像互联网上应该有一个解决方案 但我不知道为什么我找不到它 我想禁用移动设备上的水平滚动 基本上试图实现这一目标 body overflow x hidden disable horizontal scrolling 这可能是相关信
  • 在matlab中将链接插入图像?

    我想在 matlab 中的图像中添加指向文档的链接 我有一个特定的区域 我想放置链接 例如 我希望图像中 x 40 y 120 处的位置有文档地址的链接 类似于下面的内容 我知道这不是正确的 matlab 代码 text 40 120 a
  • Qt和gcov,不生成覆盖率文件

    我正在尝试获取我为 Arora 浏览器编写的组件的代码覆盖率 该组件是使用 C 和 Qt 框架编写的 我无法使用 gcov 程序 无论是在 Gnu Linux 还是 Mac Os X 下 我尝试了在互联网上找到的所有内容 还通过强制自动编辑
  • Heroku rake db:migrate 不创建表 (Rails 5)

    我有一个 Rails 5 应用程序 我想销毁并重建我的实时数据库 网站尚未启动 所以我遵循了应该有效的步骤 它们过去曾经有效 heroku pg 重置 HEROKU POSTGRESQL HEROKUCOLOR URL confirm 应用
  • 如何在javascript中获取该元素的innerHTML?

    很简单的问题 我有一个元素 标签 它有一个 onclick 来调用 JavaScript 函数 除此之外 我希望这个函数能够回显调用它的元素的innerHTML 因此 在这种情况下 atag 的innerHTML 我该怎么做呢
  • 如何为组创建属性并在 hdf5 文件系统中访问它们?

    我想在 hdf5 文件中创建两个组 第一组 h5md团体简介和 颗粒 脂质组组2描述 前者仅包含一个直接属性 版本 1 0 和两个组创建者和作者及其属性 因此这里没有数据集 在 粒子 脂质组中 唯一缺少的部分是盒子组盒组说明 最少的信息是两
  • 如何围绕任意点旋转一组 2D 形状

    我正在创建一个 Body 类 它将一堆 2D 形状组合在一起 形成一个可移动 可旋转的主体 我需要知道的是如何旋转每个单独的形状 使其看起来像是整个身体都在旋转 而不是每个形状都围绕其中心旋转 我不能只是将每个形状的旋转中心更改为同一点 因
  • 带有开始和停止按钮的 Google Sheets 秒表

    我是 Google Apps Script 和 Java 的初学者 但我需要 Google Sheets 中的秒表 具有启动和停止功能 理想情况下 该按钮应该是一个切换按钮 这样我只需一个按钮即可启动和停止秒表 并且应该显示时间 有人可以帮
  • sizeToFit() 返回错误的高度 - 需要在 heightForRow 中查找单元格宽度

    我正在尝试根据内容制作具有动态单元格高度的 UITableView 我的应用程序是一个文章查看器 我尝试用这些函数计算单元格的高度 func heightForView text String font UIFont width CGFlo
  • 设置货币格式而不进行四舍五入

    我需要将十进制数字格式化为货币 但我不希望在此过程中发生任何舍入 例如 示例文化是 en US Dim money 1234 556789D money ToString C Yields 1 234 56 notice the round
  • 给定 N 个整数的绝对值,找到 N/2 个负值和 N/2 个正值的组合,其总和最接近 0

    假设我有一个包含 10 个数字的数组 其绝对值范围可以从 1 到 10 值可以重复 这方面的一个例子可能是 2 4 2 6 9 10 1 7 6 3 我们可以为每个数字分配一个正号或负号 但每个组合中应该始终有 5 个负数和 5 个正数 例
  • 如何使用OpenCV裁剪圆形图像?

    我想知道 openCV 中是否有一种方法可以让我在两个圆之间裁剪图像 从而忽略较小内圆中的所有内容和较大圆之外的所有内容 就像甜甜圈的形状 这是在 Python OpenCV 中执行此操作的一种方法 读取输入并获取其尺寸 定义两个圆的半径和
  • 右键单击节点上的 JTree 和下拉选项

    我正在尝试使用 JTree 并为所有父节点和子节点实现不同的下拉列表 这是我所做的 pmTree addMouseListener new java awt event MouseAdapter Override public void m
  • 我无法在 .net (vb.net) webbrowser 控件中使用 websocket

    我正在尝试在 Webbrowser 控件内运行网页 其中包含与 Websocket 的连接 该控件无法连接到 Websocket 当我在IE中测试时 一切运行正常 但在Visual Studio内的Webbrowser控件中 页面无法连接到
  • 在未连接的计算机上使用 git

    我有时会在两台未连接的计算机上进行开发的项目 一个典型的例子是在 BIDS 中创建报告 工作流程如下所示 我在公司 TFS 中创建一个项目 文件夹 使用git tfs创建本地git仓库 开发报告并提交到本地存储库 以及一些到 tfs 的签入
  • 在嵌套 JAR 内的文件夹中查找文件名

    当我的应用程序打包为 JAR 时 我无法访问目标文件夹 images 我不是在获取单个文件后 我想要的是 images 文件夹中所有 jpg 文件的列表 我试过这个 URI uri getClass getClassLoader getRe