环境: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
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);
新文件系统提供程序的安装是全局的,应该只安装一次。
您很可能试图使用< 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作业。 错误日志:
我有这种情况。我正在用Spring Boot开发一个REST服务,我有一个dependency jar,这是另一个Spring Boot项目,我使用以下方法将其作为一个依赖项包括在内: https://docs.spring.io/spring-boot/docs/2.1.4.release/maven-plugin/examples/repackage-classifier.html 一切都编译