首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

GraalVM本机映像如何从Jar中读取资源文件

在使用 GraalVM 的本地映像(native image)技术时,处理资源文件(如配置文件、图片等)需要特别注意,因为本地映像在编译时会进行静态分析,并且不会自动包含所有资源文件。这意味着,如果你的应用程序在运行时需要访问这些资源,你必须显式地告诉 GraalVM 哪些资源需要被包含在最终的可执行文件中。

步骤 1: 配置 native-image 工具以包含资源文件

要确保资源文件被包括在 GraalVM 的本地映像中,你需要在构建本地映像时使用 -H:IncludeResources 参数。这个参数允许你指定一个正则表达式,匹配所有需要包含的资源文件的路径。

例如,如果你的应用程序中有一些配置文件和其他资源位于 config/ 目录和 data/ 目录下,你可以在构建本地映像时使用以下命令:

代码语言:javascript
复制
native-image -H:IncludeResources="config/.*|data/.*" -jar your-app.jar

这条命令告诉 native-image 工具将 configdata 目录下的所有文件包含在生成的本地映像中。

步骤 2: 在应用程序中正确访问资源

在 Java 应用程序中,通常使用 ClassLoadergetResourcegetResourceAsStream 方法来访问 JAR 文件中的资源。当你的应用被编译成本地映像后,这些方法仍然有效,前提是资源已经被正确包含如上所述。

例如,你可以使用以下代码来读取一个配置文件:

代码语言:javascript
复制
InputStream is = getClass().getClassLoader().getResourceAsStream("config/settings.conf");
if (is != null) {
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(is))) {
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
} else {
    System.out.println("Resource not found");
}

步骤 3: 测试和验证

在你构建本地映像并运行你的应用程序后,确保测试所有依赖于资源文件的功能。这是检查是否所有必要的资源都被正确包含并可以被应用访问的重要步骤。

注意事项

  • 使用 GraalVM 本地映像时,对资源文件的处理与传统的 Java 应用有所不同。确保你理解了这些差异,特别是在资源包含和访问方面。
  • 正则表达式 -H:IncludeResources 需要精确匹配你的资源文件路径。确保测试这些路径是否正确。
  • 考虑到性能和可执行文件大小,只包含应用运行时真正需要的资源。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

javajar包内的类访问jar包内部的资源文件路径和获得读取资源文件内容的问题

在大数据开发和java web开发,我们有时会在程序读取一些资源文件的内容。...当我们在本地运行调试的时候是没有任何问题的,但是当我们将程序打成jar包上传到集群后运行时,发现报错:“找不到配置文件的路径”。虽然jar确实存在配置文件,但是还是读取不到。...相关解决方法可以参考以下相关资料:  javajar包内的类访问jar包内部的资源文件的路径问题: http://blog.csdn.net/mm_bit/article/details/50372229...获取jar包内部的资源文件: http://blog.csdn.net/luo_jia_wen/article/details/50057191 【解惑】深入jar包:jar读取资源文件: http...://www.iteye.com/topic/483115  jar读取资源配置文件jar包内包外,以及包内读取目录的方法: http://blog.csdn.net/T1DMzks/article/

9.3K20

Spring Native 中文文档

常规 JVM 和此本机映像平台之间的主要区别: 在构建时会主入口点对应用程序进行静态分析。 在构建时将未使用的零件删除。 反射,资源和动态代理需要配置。 类路径在构建时是固定的。...resources 其中列出了与应该包含在映像资源(包括.class文件)匹配的模式。 initialization 其中列出了应该在构建时或运行时显式初始化的类/程序包。...为了解决此问题,代理支持访问过滤器文件,该文件将导致某些数据生成的输出中排除。...如何贡献 本节描述如何为Spring应用程序中使用的库或功能贡献本机支持。...在Mac上,请确保在Docker首选项资源选项卡为其分配了足够的内存,最好是10G或更多,否则在构建映像时可能会遇到内存不足的问题。

10.3K10
  • Spring 官宣,抛弃原生 JVM!网友:这是要单干啊!

    实际上,这意味着自 Spring 成立以来,除了 Spring 支持的常规 Java 虚拟机之外,我们还将添加 Beta 支持,以使用 GraalVM 将 Spring 应用程序编译到本机映像,从而提供一种部署...使用简单mvn spring-boot:build-image或gradle bootBuildImage命令,您可以生成一个优化的容器映像,该映像将包含一个最小的 OS 层和一个小的本机可执行文件,该映像仅随附...提前转换 本机不同于 JVM:类路径在构建时是固定的,例如需要反射或资源进行配置,没有类延迟加载(可执行文件附带的所有内容在启动时都加载到内存),并且可以调用一些代码在构建时。...第一种转换旨在基于由惊人的 Andy Clement 设计和实现的推理引擎来生成 GraalVM 本机配置(反射,资源,代理,本机映像选项),该引擎了解什么是 Spring 编程模型和基础架构。...这将使 GraalVM 本机图像编译器可以立即了解 Spring 配置,而无需任何反射配置或*.class资源

    1.7K20

    2020年你将会选择哪个微服务框架?

    该示例应用程序包括一个用于创建,读取,更新和删除对象的REST接口,以及将这些对象存储到表的接口。我使用OpenJDK Docker映像运行了所有应用程序。...我已经测试了执行干净构建所需的时间,包括生成Docker映像。对于GraalVM,这包括生成本机映像的时间。 启动应用程序需要多长时间?...在这里,我测试了运行docker up到应用程序正确响应第一个HTTP请求之间的时间。另外,我还比较了启动后测试的空闲应用程序的内存占用量。 应用程序支持请求负载情况如何?...我认为Micronaut Data以后可以添加到Spring Data方案。 事实证明,本机GraalVM映像在启动时具有令人难以置信的快速性和内存效率,但是在负载下,它们并没有明显的优势。...由于本机GraalVM的生成会带来一些额外的困难,并且编译时间会急剧增加,因此该技术目前仅在需要快速启动时才有用。例如在Serviceless架构

    2.8K11

    Spring新版本抛弃JVM,可独立部署,网友:要自立门户???

    实际上,这意味着自 Spring 成立以来,除了 Spring 支持的常规 Java 虚拟机之外,我们还将添加 Beta 支持,以使用 GraalVM 将 Spring 应用程序编译到本机映像,从而提供一种部署...图片 使用简单mvn spring-boot:build-image或gradle bootBuildImage命令,您可以生成一个优化的容器映像,该映像将包含一个最小的 OS 层和一个小的本机可执行文件...提前转换 本机不同于 JVM:类路径在构建时是固定的,例如需要反射或资源进行配置,没有类延迟加载(可执行文件附带的所有内容在启动时都加载到内存),并且可以调用一些代码在构建时。...第一种转换旨在基于由惊人的 Andy Clement 设计和实现的推理引擎来生成 GraalVM 本机配置(反射,资源,代理,本机映像选项),该引擎了解什么是 Spring 编程模型和基础架构。...这将使 GraalVM 本机图像编译器可以立即了解 Spring 配置,而无需任何反射配置或*.class资源

    1.6K20

    Spring新版本抛弃JVM,可独立部署,网友:要自立门户???

    实际上,这意味着自 Spring 成立以来,除了 Spring 支持的常规 Java 虚拟机之外,我们还将添加 Beta 支持,以使用 GraalVM 将 Spring 应用程序编译到本机映像,从而提供一种部署...图片 使用简单mvn spring-boot:build-image或gradle bootBuildImage命令,您可以生成一个优化的容器映像,该映像将包含一个最小的 OS 层和一个小的本机可执行文件...提前转换 本机不同于 JVM:类路径在构建时是固定的,例如需要反射或资源进行配置,没有类延迟加载(可执行文件附带的所有内容在启动时都加载到内存),并且可以调用一些代码在构建时。...第一种转换旨在基于由惊人的 Andy Clement 设计和实现的推理引擎来生成 GraalVM 本机配置(反射,资源,代理,本机映像选项),该引擎了解什么是 Spring 编程模型和基础架构。...这将使 GraalVM 本机图像编译器可以立即了解 Spring 配置,而无需任何反射配置或*.class资源

    85030

    Spring 官宣,干掉原生 JVM!

    实际上,这意味着自 Spring 成立以来,除了 Spring 支持的常规 Java 虚拟机之外,我们还将添加 Beta 支持,以使用 GraalVM 将 Spring 应用程序编译到本机映像,从而提供一种部署...使用简单mvn spring-boot:build-image或gradle bootBuildImage命令,您可以生成一个优化的容器映像,该映像将包含一个最小的 OS 层和一个小的本机可执行文件,该映像仅随附...提前转换 本机不同于 JVM:类路径在构建时是固定的,例如需要反射或资源进行配置,没有类延迟加载(可执行文件附带的所有内容在启动时都加载到内存),并且可以调用一些代码在构建时。...第一种转换旨在基于由惊人的 Andy Clement 设计和实现的推理引擎来生成 GraalVM 本机配置(反射,资源,代理,本机映像选项),该引擎了解什么是 Spring 编程模型和基础架构。...这将使 GraalVM 本机图像编译器可以立即了解 Spring 配置,而无需任何反射配置或*.class资源

    1.2K40

    Spring Native Beta 正式发布,干掉原生 JVM!

    实际上,这意味着自Spring成立以来,除了Spring支持的常规Java虚拟机之外,还将添加Beta支持,以使用GraalVM将Spring应用程序编译到本机映像,从而提供一种部署Spring应用程序的新方法...这些本机Spring应用程序可以部署为独立的可执行文件(无需安装JVM),并提供有趣的特性,包括几乎即时启动(通常<100ms),即时峰值性能和较低的内存消耗,但所需的构建时间和运行时优化次数少于JVM...使用简单mvn spring-boot:build-image或gradle bootBuildImage命令,您可以生成一个优化的容器映像,该映像将包含一个最小的OS层和一个小的本机可执行文件,该映像仅随附...请参阅下面的示例,其中包含50MB可执行文件的最小容器映像,其中包含Spring Boot,Spring MVC,Jackson,Tomcat,JDK和应用程序。...预先转换 原生与 JVM 有所不同:类路径在构建时是固定的,反射或资源需要进行配置,这里没有类的懒加载(可执行文件包含的所有内容在启动的时候都会加载进来)并且有些代码可以在构建期调用。

    1.5K10

    Spring6和SpringBoot3的新特性-你不得不了解的AOT原来这么简单

    Spring6 支持的 AOT 技术,这个 GraalVM 就是底层的支持,Spring 也对 GraalVM 本机映像提供了一流的支持。...GraalVM 提供两种运行 Java 应用程序的方法:在 HotSpot JVM 上使用 Graal 即时 (JIT) 编译器或作为提前 (AOT) 编译的本机可执行文件。...GraalVM 具有以下特性: (1)一种高级优化编译器,它生成更快、更精简的代码,需要更少的计算资源 (2)AOT 本机图像编译提前将 Java 应用程序编译为本机二进制文件,立即启动,无需预热即可实现最高性能...后续执行该文件就可以了 编译成功 然后我们双击执行exe文件即可。你会发现速度会快很多 五、RuntimeHints   与常规 JVM 运行时相比,将应用程序作为本机映像运行需要额外的信息。...例如,GraalVM 需要提前知道组件是否使用反射。同样,除非明确指定,否则类路径资源不会在本机映像中提供。因此,如果应用程序需要加载资源,则必须相应的 GraalVM 原生图像配置文件引用它。

    2.7K30

    Spring6 正式发布!重磅更新,是否可以拯救 Java

    GraalVM 本机映像的一流支持(请参阅相关的 SpringBoot3 博客文章)。 核心容器 默认情况下,没有 java.beans.Invector 的基本 bean 属性确定。...测试 支持在 JVM 上或 GraalVM 本机映像测试 AOT 处理的应用程序上下文。 与 HtmlUnit 2.64+请求参数处理集成。...Graalvm 前面说到了 Spring6 支持的 AOT 技术,这个 Graalvm 就是底层的支持,Spring 也对 GraalVM 本机映像提供了一流的支持。...GraalVM 提供两种运行 Java 应用程序的方法:在 HotSpot JVM 上使用 Graal 即时 (JIT) 编译器或作为提前 (AOT) 编译的本机可执行文件。...Graalvm 架构如下图所示: GraalVM 具有以下特性: 高性能应用 Graal,一种高级优化编译器,它生成更快、更精简的代码,需要更少的计算资源 AOT 本机图像编译提前将 Java 应用程序编译为本机二进制文件

    7.8K01

    实用:如何将aop的pointcut值配置文件读取

    于是我们想做成一个统一的jar包来给各项目引用,这样每个项目只须要引用该jar,然后配置对应的切面值就可以了。...我们都知道,java的注解里面的值都是一个常量, 如: @Pointcut("execution(* com.demo.Serviceable+.*(..))")...但是我们又要实现这将aop的切面值做成一个动态配置的,每个项目的值的都不一样的,该怎么办呢?...这样,各项目只须要引用该jar,然后在配置文件中指定要拦截的pointcut就可以了。 ---- 大黄:本文主要为抛砖引玉,提供一个思路。...比如,我们定时器采用注解方式配置的时候,cron表达式也是注解里面的一个字符串常量,那么,我们能不能通过配置文件的方式来配置这个cron呢?原理都是一样的。

    23.8K41

    Native镜像技术在Spring的应用

    实际上,这意味着自Spring成立以来,除了Spring支持的常规Java虚拟机之外,我们还将添加Beta支持,以使用GraalVM将Spring应用程序编译到本机映像,从而提供一种部署Spring应用程序的新方法...这些本机Spring应用程序可以部署为独立的可执行文件(无需安装JVM),并提供有趣的特性,包括几乎即时启动(通常<100ms),即时峰值性能和较低的内存消耗,但所需的构建时间和运行时优化次数少于JVM...更好的资源利用率:由于减少了内存消耗,Spring Native可以在有限的资源环境更有效地运行,提供更好的可伸缩性和性能。...您可以GraalVM官方网站(https://www.graalvm.org)下载适合您操作系统的GraalVM发行版,并按照官方文档进行安装。...依赖项处理:在传统JVM调优,依赖项通常以JAR文件的形式打包,并在运行时通过类加载器进行动态加载。

    31310

    Spring6 AOT 提前编译

    1.2、GraalvmSpring6 支持的 AOT 技术,这个 GraalVM 就是底层的支持,Spring 也对 GraalVM 本机映像提供了一流的支持。...GraalVM 提供两种运行 Java 应用程序的方法:在 HotSpot JVM 上使用 Graal 即时 (JIT) 编译器或作为提前 (AOT) 编译的本机可执行文件。...GraalVM 具有以下特性:(1)一种高级优化编译器,它生成更快、更精简的代码,需要更少的计算资源(2)AOT 本机图像编译提前将 Java 应用程序编译为本机二进制文件,立即启动,无需预热即可实现最高性能...Native Image 是一项创新技术,可将 Java 代码编译成独立的本机可执行文件本机共享库。...在构建本机可执行文件期间处理的 Java 字节码包括所有应用程序类、依赖项、第三方依赖库和任何所需的 JDK 类。生成的自包含本机可执行文件特定于不需要 JVM 的每个单独的操作系统和机器体系结构。

    28920

    Spring Boot 3.2 正式发布,一波新特性,开箱即用!

    我们不打算深入细节,官方 JEP 提供了很好的解释: https://openjdk.org/jeps/444 GraalVM本机镜像 GraalVM 是一种高性能 JDK,可以使用替代的即时 (JIT...Native Image 是一种提前将 Java 代码编译为独立可执行文件(称为本机映像)的技术。该可执行文件包括应用程序类、其依赖项的类、运行时库类以及来自 JDK 的静态链接本机代码。...要在 Spring Boot 3.2 启用虚拟线程,我们只需在 application.yml 或 application.properties 文件设置一个属性: spring.threads.virtual.enabled...现在让我们在 GraalVM 上运行它。 首先,我们需要构建一个 GraalVM 本机映像:(此命令可能需要几分钟)然后运行:(使用您的应用程序的名称而不是“app”) ....具有虚拟线程的本机映像允许我们编写能够提供与 Go 类似级别的性能和可扩展性的代码,从而保持 JVM 的强大生态系统。

    3.5K10

    Java微服务 vs Go微服务,究竟谁更强!?

    Oracle实验室最近已经开发了一个新的Java虚拟机GraalVM,它有一个新的编译器和一些令人兴奋的新特性,比如能够将Java字节码转换成一个本机映像,可以在没有javavm的情况下运行等。...Go编译成一个本机静态链接的二进制文件-没有虚拟机层-二进制文件拥有运行程序所需的一切,这对于“从头开始”的容器来说非常好。...应用程序的环境,添加了 GraalVM 映像测试(用 GraalVM EE 20.1.1ー JDK 11构建的本机映像)的结果是: 通过使用 GraalVM 映像在 JVM 上运行应用程序,我们没有看到吞吐量或响应时间方面的任何实质性改进...结果如下: 这一回合是GraalVM 映像赢了! 下面是一些测试的响应时间图: 在这个测试,Java变体的表现要好得多,并且在没有使用Java日志记录的情况下,它的性能大大超过了Go。...GraalVM映像比在jvm上运行的同一应用程序快大约30–40%! 第三回合 这次,比赛在Kubernetes集群运行这些应用程序,这是一个更自然的微服务运行时环境。

    78920

    Spring Native beta 版发布, 技术融合越来越快

    三、支持范围 随着 Spring Native alpha 过渡到 beta 版,弄清支持范围非常重要。...五、Ahead-of-time(AOT)转换 Native 与 JVM 不同之处:classpath 在构建时是固定的,反射或资源需要配置,没有类延迟加载(可执行文件的所有内容都在启动时加载到内存...第一种转换是基于著名的 Andy Clement 设计和实现的推理引擎来生成 GraalVM Native 配置(反射、资源、代理、本机映像选项),Andy Clement 了解 Spring 编程模型和基本构造是什么样的...例如,对于@Controller注解的每一个类,都有一个条目被添加到已生成的reflect-config.json文件。...这将允许 GraalVM 本机映像编译器能开箱即用的推断 Spring 配置,而不需要任何反射配置或*.class资源

    1.6K40

    体验79毫秒启动一个项目

    Spring Native 为使用 GraalVM 原生镜像编译器编译 Spring 应用为本地可执行文件提供支持。...上面提到了原生镜像,简单来说原生镜像是一种将Java代码提前编译为独立可执行文件(称为本机映像)的技术。可执行文件包括应用程序类,以及其依赖项的类,运行时库类以及JDK的静态链接本机代码。...小芝士,GraalVM官网对原生镜像的解释: 原生镜像提供了一种构建和运行具有不同于常规JVM部署特性的Spring Boot应用程序的方法: 输出是一个本机可执行文件,其中包含您的应用程序以及JDK...在实践,可执行文件可能会以高度优化的容器映像(FROM scratch支持Docker镜像)的形式提供,并且减少了表面攻击,非常适合Kubernetes。...这些原生的 Spring 应用可以作为一个独立的可执行文件(原生镜像)进行部署(不需要安装 JVM),性能非常强: 几乎瞬时的启动(一般会小于 100 毫秒) 瞬时的峰值性能以及更低的资源消耗 当然牛逼的背后肯定要稍微付出一点代价

    94820
    领券