当前位置: 首页 > 知识库问答 >
问题:

无法读取spring启动包jar文件

常飞翼
2023-03-14

环境:Ubuntu 18Spring开机2.0 JDK 11

当应用程序在IntelliJ中运行时,它会正确执行,但在Spring Bootmaven插件打包文件后读取文件时不会。

PS:该文件确实可以在打包的jar文件中找到!

java.io.FileNotFoundException: class path resource [jmxremote.password] 
cannot be resolved to absolute file path because it does not reside in the 
file system: jar:file:/home/XXX/YYY/target/YYY-1.0-Final.jar!/BOOT-
INF/classes!/jmxremote.password

共有2个答案

逑兴安
2023-03-14

TL;速度三角形定位法(dead reckoning)

在 Spring 框架环境中,专注于使用 Spring 实用程序工具来处理资源(如 ResourceUtils 类),它很好地封装了较低级别的、依赖于操作系统的 IO 操作。资源工具已经包含多个陷阱,以确定您正在运行的项目是分解的(在IDE中运行)还是打包的(在JAR文件中)。

凯罗尔提供的答案似乎是最简单的,也是相对可靠的,除非您需要一定程度的灵活性来指定文件位置(在jar文件中,但有可能在外部定义并在文件系统中的某个位置提供)。那么使用< code > getResourceAsStream()方法的方法就行不通了。

标准JavaIO(java.nio)使用FileSystemProvider类来委托IO操作(如创建、读取和删除文件)。

提供程序由URI方案标识。默认提供程序由URI方案“文件”标识。它创建FileSystem,提供对Java虚拟机可访问的文件系统的访问。FileSystems类定义如何定位和加载文件系统提供程序。

因此,如果您的文件位于文件系统中的某个位置,则不会出现任何问题,并且一切正常。从技术上讲,Application.class.getResource(“”)返回的URL。toURI()以file://开头,并包含有效的文件系统路径。

话虽如此,当您的文件“降落”在jar文件中时,Application.class.getResource(“”)。toURI()返回类似于文件的内容://{jar location}!/(注意感叹号),这不是有效的文件模式路径,Java不知道如何处理它。需要注册其他文件系统提供程序。

FileSystems.newFileSystem(uri, emptyMap());

Java想出了(基于URI的)方案并注册了一个新的文件系统。从现在开始,可以使用标准的< code>java.nio文件操作。

例如,如果/webapp文件夹中有一些文件可以(但不是必须)在jar文件中,并且您想要列出它们。

// Load zip specific filesystem provider when run from inside a fat-jar
URI uri = Application.class.getResource("").toURI();
if (uri.toString().contains("!")) {
    FileSystems.newFileSystem(uri, emptyMap());
}

URI rootFolder = Application.class.getResource("/webapp").toURI();
List<Path> banners = Files.list(Paths.get(rootFolder))
        .collect(Collectors.toList());

Random rand = new Random();
Path path = banners.get(rand.nextInt(banners.size()));

log.info("Random image: {}", path.getFileName());
byte[] bytes = Files.readAllBytes(path);

新文件系统提供程序的安装是全局的,应该只安装一次。

裴楚青
2023-03-14

您很可能试图使用< code>java.io类来加载类路径资源。这是行不通的,< code>java.io类只为文件系统操作而设计

要么在 JAR 外部提取 jmxremote.密码,要么使用常规的输入流将其作为类路径资源进行访问,例如通过使用类.

try (InputStream in : getClass().getResourceAsStream("/jmxremote.password")) {
  // read input
}
 类似资料:
  • 问题内容: 美好的一天! 我创建了jar文件(使用Netbeans),但无法启动。该项目使用lwjgl库。在我的IDE中,它运行良好。 我使用下一个命令: 答案是: 其他项目(没有此库)可以正常工作。我该如何解决这个错误? 我的清单是: 问题答案: 由于您需要将本地文件放在jar旁边,并通过’-Djava.library.path’参数指向它们,因此它无法按照您当前尝试的方式工作。 如果您只想要一

  • 我很难弄清楚这个问题,我几乎什么都试过了。 我希望我的程序从Jar文件中读取两个资源,并且它将在eclipse中运行良好。但是当我从命令提示符运行jar时,它会给出空指针异常。 结构: src/main/java/App。JAVA src/main/resources/properties/application。属性 src/main/resources/spring/applicationCo

  • 当我构建一个jar文件并运行它时,由于找不到图像图标,它显示一个空指针异常 这是我运行jar文件时得到的错误 但是当我在NetBeans中运行这个项目时,它运行良好 这是我列出罐子里所有文件时的输出

  • 我在eclipse中有一个项目,它使用ant来编译和jar类文件和引用的jar。使用eclipse中的默认java builder生成的类文件生成的jar文件工作良好,但是当使用ant编译源代码然后jar结果时,在目标构建上执行java-jar时会出现错误“错误:尝试打开文件时出现意外错误”结果。有人知道我做错了什么吗?下面是构建xml内容。下面是我传递给ant的参数 -dintouchv.src

  • 我们使用Spark CSV reader读取CSV文件以转换为DataFrame,并在上运行该作业,它在本地模式下运行良好。 我们在中提交spark作业。 错误日志:

  • 我是drools的新手,我无法访问包中的DRL文件。我也是这么想的。我的项目规则的层次结构是这样的 我尝试使用以下代码访问DRL文件: 导致错误: