Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring Boot 中的 classpath详解

Spring Boot 中的 classpath详解

作者头像
九转成圣
发布于 2025-01-03 01:56:45
发布于 2025-01-03 01:56:45
31700
代码可运行
举报
文章被收录于专栏:csdncsdn
运行总次数:0
代码可运行
Spring Boot 中的 classpath 详解

在开发 Spring Boot 应用时,理解 classpath 的概念对于配置、资源管理以及构建项目非常重要。特别是当我们使用 Maven 打包工具时,项目的资源文件在不同的阶段会被放置到不同的目录。本文将深入探讨 Spring Boot 中的 classpath 和相关资源的管理方式,尤其是当我们使用 Maven 进行构建时,资源文件如何从开发环境的 resources 目录移动到最终的 JAR 包中的 BOOT-INF/classes 目录。

1. 什么是 classpath

classpathJava 程序用来寻找类和资源文件的路径。它指定了 JVM 在运行时加载类和资源的路径。Spring Boot 应用程序,尤其是通过 Maven 构建时,classpath 起着至关重要的作用,因为它不仅包括 Java 类文件,还包括其他资源文件,如配置文件、静态文件、模板文件等。

2. Spring Boot 中的资源管理

在 Spring Boot 中,所有的资源文件,如 application.propertiesapplication.yml、静态文件(例如 .html, .js, .css)和模板文件(如 .ftl.thymeleaf 等)都可以放置在 src/main/resources 目录下。

2.1 开发阶段的资源文件存放

在开发阶段,Spring Boot 使用的是 Maven 构建工具,项目中的资源文件一般会存放在 src/main/resources 目录下。

src/main/resources 目录结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
src
└── main
    └── resources
        ├── application.properties
        ├── static
        │   ├── js
        │   └── css
        ├── templates
        │   └── index.html
        └── other-files
            └── some-file.txt

在该阶段,Spring Boot 会直接加载 src/main/resources 目录下的文件,无需额外的配置。Spring Boot 自动扫描 resources 目录中的文件,并将它们作为 classpath 中的资源进行加载。

2.2 编译阶段

当我们使用 Maven 构建项目时,资源文件会在构建过程中被复制到 target/classes 目录下。Maven 使用 resources 插件来处理这些资源,并确保在编译时将所有的资源文件从 src/main/resources 复制到 target/classes 目录。这个目录就是我们所说的类路径(classpath)的一部分。

target/classes 目录结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
target
└── classes
    ├── application.properties
    ├── static
    │   ├── js
    │   └── css
    ├── templates
    │   └── index.html
    └── other-files
        └── some-file.txt

此时,Spring Boot 的应用程序已经可以直接从 target/classes 目录加载资源文件。

3. 打包为 JAR 文件

当使用 Maven 打包构建 Spring Boot 项目时,最终的输出是一个包含所有依赖和资源的 JAR 文件。Spring Boot 使用 Maven 插件来创建可执行 JAR 文件,该 JAR 文件包含了项目的所有 .class 文件和资源文件。

3.1 JAR 文件中的目录结构

Spring Boot 创建的 JAR 文件是一个自包含的文件,包含了应用程序的所有必要组件,资源文件会被放置在 BOOT-INF/classes 目录下。这与传统的 JAR 文件不同,传统的 JAR 文件将资源文件直接放置在根目录下,而 Spring Boot 会将所有资源文件放到 BOOT-INF/classes 目录下,并保持原有的目录结构。

target 目录下的 JAR 文件结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
target
└── my-application.jar
    ├── BOOT-INF
    │   └── classes
    │       ├── application.properties
    │       ├── static
    │       │   ├── js
    │       │   └── css
    │       ├── templates
    │       │   └── index.html
    │       └── other-files
    │           └── some-file.txt
    ├── META-INF
    └── org
        └── springframework
            └── boot
                └── loader

在这个结构中,Spring Boot 的资源文件被组织在 BOOT-INF/classes 目录下。所有的资源文件,包括 application.properties、静态资源和模板文件,都位于这个目录下。Maven 在构建过程中会将这些文件从 target/classes 目录中复制到 JAR 包的 BOOT-INF/classes 目录。

3.2 BOOT-INF/classes 目录

Spring Boot 的 JAR 包内部结构包括:

  • BOOT-INF/classes:这是应用程序的类和资源文件所在的目录。Spring Boot 会从这个目录中加载所有的类和资源。
  • BOOT-INF/lib:这个目录包含应用程序的所有依赖 JAR 文件,Spring Boot 会将这些 JAR 文件作为应用程序的依赖进行加载。
  • META-INF:这个目录包含了 JAR 文件的元数据,如 MANIFEST 文件、Spring Boot 启动器的配置等。
4. Maven 配置

Maven 在构建 Spring Boot 应用时,使用 spring-boot-maven-plugin 插件来创建可执行 JAR 文件。这个插件会自动处理 JAR 文件的生成过程,并将应用程序的类和资源文件正确放置到 JAR 文件的相应位置。

pom.xml 示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Other dependencies -->
</dependencies>

<build>
    <plugins>
        <!-- Spring Boot Maven Plugin -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

在 Maven 中,spring-boot-maven-plugin 会自动处理资源文件的拷贝,并将其正确地放入 BOOT-INF/classes 目录下。它确保在 JAR 文件中包含所有必要的文件,以便应用能够正确运行。

5. 运行 JAR 文件

当我们执行 java -jar my-application.jar 来启动 Spring Boot 应用时,Spring Boot 会使用 BOOT-INF/classes 目录下的资源文件和类来启动应用。

  • Spring Boot 启动过程
    • Spring Boot 会自动识别 JAR 包中的 BOOT-INF/classes 目录,并将其作为类路径加载。
    • 配置文件、静态资源和模板文件都会从 BOOT-INF/classes 中加载,确保应用的资源正确加载。
6. 资源加载的机制

Spring Boot 在启动时会通过类加载器加载 JAR 文件中的资源。如果需要访问资源,Spring Boot 会依赖 Spring 的 ResourceLoader 来提供对 classpath 中资源的访问支持。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Autowired
private ResourceLoader resourceLoader;

public void loadFile() throws IOException {
    Resource resource = resourceLoader.getResource("classpath:application.properties");
    InputStream inputStream = resource.getInputStream();
    // 读取文件内容
}

ResourceLoader 通过 classpath: 前缀来访问类路径下的资源。

总结

在 Spring Boot 中,classpath 是应用程序中资源文件存放和访问的关键部分。在开发阶段,资源文件存放在 src/main/resources 目录中,编译后被复制到 target/classes 目录中。最终打包为 JAR 文件时,资源文件会被放置在 BOOT-INF/classes 目录下,这与传统 JAR 文件的结构不同。Spring Boot 使用 Maven 构建时,spring-boot-maven-plugin 会自动处理资源文件的拷贝和组织,确保它们能够在应用程序启动时被正确加载。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
关于Spring Boot你不得不知道的事--Spring Boot的基本操作
表示当前pom文件从spring-boot-starter-parent继承下来,在spring-boot-starter-parent中提供了很多默认配置,可以简化我们的开发。
Java架构
2019/06/21
9840
关于Spring Boot你不得不知道的事--Spring Boot的基本操作
SpringBoot Jar包瘦身 - 跟大文件说再见!
SpringBoot部署起来配置非常少,如果服务器部署在公司内网,上传速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼、就是 编译出来的 Jar 包很大,如果工程引入了许多开源组件(SpringCloud等),那就更大了。这个时候如果想要对线上运行工程有一些微调,则非常痛苦
云扬四海
2019/08/06
1.8K0
Spring boot 项目打出来的包启动过程
spring boot 的工程支持打包为jar和war,打包成 jar 或 war 可以直接用 java -jar xxx.jar 来启动,war包也可以放入tomcat等容器中运行。
前Thoughtworks-杨焱
2021/12/07
1.8K0
Spring boot 项目打出来的包启动过程
Hello Spring Boot
Spring Boot 可以称之为 新一代 JavaEE 开发标准;随着动态语言的流行 (Ruby、Groovy、Scala、Node.js ),Java 的开发显得格外的笨重:繁多的配置、低下的开发效率、复杂的部署流程以及第三方技术集成难度大。
LCyee
2020/08/05
4670
Hello Spring Boot
当我们的执行 java -jar xxx.jar 的时候底层到底做了什么?
大家都知道我们常用的 SpringBoot 项目最终在线上运行的时候都是通过启动 java -jar xxx.jar 命令来运行的。
Java极客技术
2023/02/23
7930
当我们的执行 java -jar xxx.jar 的时候底层到底做了什么?
Spring Boot - 瘦身大作战:优雅应对Spring Boot Fat Jar
通过启动参数loader.path配置外置依赖包的加载路径。 项目成功启动,说明我们配置的外包依赖包加载生效了
小小工匠
2023/11/26
9120
Spring Boot - 瘦身大作战:优雅应对Spring Boot Fat Jar
使用Spring Boot创建docker image
在很久很久以前,我们是怎么创建Spring Boot的docker image呢?最最通用的办法就是将Spring boot的应用程序打包成一个fat jar,然后写一个docker file,将这个fat jar制作成为一个docker image然后运行。
程序那些事
2020/11/03
1.6K0
使用Spring Boot创建docker image
spring Boot 配置文件详解
概要        前面我们讲述了如何搭建一个简单的 spring Boot 应用(参见Spring Boot - 初探),这里,我们来学习如何对项目进行相关的配置,包括系统构建、自动配置、依赖注入、开发工具等,使其更好地运行。 系统构建        为了便于依赖管理,官方建议我们使用Maven或者Gradle,以便进行依赖管理。当然,Spring Boot 也支持其他系统构建方式(如Ant)。         使用 Spring Boot ,你不需要提供相关依赖的版本,Spring Boot 会自动对其
xiangzhihong
2018/02/05
1.6K0
首页Spring BootSpring Boot入门学习
J2EE笨重的开发,繁多的配置,低下的开发效率,复杂的部署流程,第三方技术集成难度大。
cherishspring
2019/10/14
1.1K0
Spring Boot 2.X(一):入门篇
Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架遵循”约定优于配置“的思想,清除了原先使用Spring框架的那些样板化的配置,继承了原有Spring框架的优秀基因,从而帮助开发者快速开发应用。
朝雾轻寒
2019/10/18
7200
Spring Boot 2.X(一):入门篇
spring-boot-starter大力出奇迹
​  上篇文章我们已经聊了SpringBoot的启动过程中的各类扩展点,那么从http://start.spring.io上我们生成的demo项目中,到目前就剩下了maven工程的pom.xml还没有进行探索了,那么本文我们就来看看这里面到底都有啥,把大力出奇迹的常见spring-boot-starter来聊一聊,以便更好地使用SpringBoot.
阿豪聊干货
2018/08/09
9990
Spring Boot 怎么打一个可执行 Jar 包?
传统的 Java 应用程序都需要打一个 war 包,并到到 Tomcat webapps 目录下运行。
Java技术栈
2019/10/29
1.5K0
spring boot 使用maven和fat jar/war运行应用程序的对比
上篇文章我们介绍了Spring boot的fat jar/war包,jar/war包都可以使用 java -jar 命令来运行,而maven也提供了mvn spring-boot:run 命令来运行应用程序,下面我们看看两者有什么不同。
程序那些事
2020/07/08
1.6K0
Spring Boot从零入门7_最新配置文件配置及优先级详细介绍
本文属于原创,转载注明出处,欢迎关注微信小程序小白AI博客 微信公众号小白AI或者网站 https://xiaobaiai.net 或者我的CSDN http://blog.csdn.net/freeape
别打名名
2019/12/23
9190
企业都在用的 spring boot 打包插件,真的超好用!
在平时的项目中,我们用到了 spring boot 默认的插件 spring-boot-maven-plugin 来进行打包,打的包是直接可执行的。但是这次,有一个多模块项目,我负责其中一个模块的开发,开发完成之后,发现打的包直接执行报找不到主类,这就有点奇怪了,所以就有了这篇文章。
create17
2020/07/14
1.8K0
企业都在用的 spring boot 打包插件,真的超好用!
记录 Spring Boot2 启动报错The bean ‘beanNameViewResolver‘, defined in class path resource 解决过程
在必问里面回答一个网友的问题:https://biwen.csdn.net/question/4664
黄规速
2022/04/14
1.9K0
记录 Spring Boot2 启动报错The bean ‘beanNameViewResolver‘, defined in class path resource 解决过程
第9章 Spring Boot开发者工具第9章 Spring Boot开发者工具
Spring Boot Maven Plugin,提供了使用Maven构建Spring Boot 工程的支持。我们可以用这个插件完成打包功能。支持打可执行jar包, war包。该插件支持Maven 3.2 +版本。
一个会写诗的程序员
2018/08/20
1.3K0
第9章 Spring Boot开发者工具第9章 Spring Boot开发者工具
Spring Boot2 系列教程(四十)Spring Boot 可执行 jar 分析
“松哥,为什么我的 Spring Boot 项目打包成的 jar ,被其他项目依赖之后,总是报找不到类的错误?”
江南一点雨
2019/12/18
1.5K0
Spring Boot 项目打包问题集锦: jar依赖多出boot-inf 文件夹问题/多环境动态打包/缺少BOOT-INF目录问题等
使用maven插件打包后,发现包很小100来kb,显然是不对,包内缺少BOOT-INF目录,BOOT-INF是用于存放引用的外部lib的,所以缺少,打出来的包根本不能运行:
一个会写诗的程序员
2021/07/15
3.5K0
SpringBoot系列-- jar可执行原理
文章篇幅较长,但是包含了SpringBoot 可执行jar包从头到尾的原理,请读者耐心观看。
田维常
2020/02/13
9650
推荐阅读
相关推荐
关于Spring Boot你不得不知道的事--Spring Boot的基本操作
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验