【Maven】Maven的classpath

1、概念

Maven 的 classpath 是指在构建和运行项目时,Java 编译器和运行时环境用来查找类文件和其他资源的路径集合。Maven 通过其依赖管理和构建生命周期来自动管理 classpath,确保所有必要的库和资源都被正确包含。

2、Maven Classpath 的分类

Maven 有三套 classpath,编译 classpath、测试 classpath 和运行 classpath,实质就是不同作用域的依赖在编译、测试或运行时是否会发挥作用。

  • 编译 classpath:能否让项目顺利通过编译不报错
  • 测试 classpath:在测试时依赖能否被引用
  • 运行 classpath:依赖是否会被打包进项目

3、Maven Classpath 的组成

Maven 的 classpath 主要由以下几个部分组成:

(1) 项目自身的源代码:

  • src/main/java:包含应用程序的主要Java源代码。
  • src/test/java:包含测试代码。

(2) 项目自身的资源文件:

  • src/main/resources:包含应用程序的主要资源文件(如配置文件、静态资源等)。
  • src/test/resources:包含测试所需的资源文件。

(3) 依赖项:

  • Maven 会根据 pom.xml 中定义的依赖关系,从本地仓库、中央仓库或自定义远程仓库中下载并添加到 classpath 中。

(4) 插件提供的类和资源:

  • 某些 Maven 插件可能会提供额外的类或资源,这些也会被添加到 classpath 中。

(5) 编译输出目录:

  • target/classes:存放编译后的主代码和资源文件。
  • target/test-classes:存放编译后的测试代码和资源文件。

4、Maven 如何管理 Classpath

Maven 使用一种称为"依赖解析"的机制来确定哪些依赖应该被包含在 classpath 中,并且根据不同的构建阶段(如编译、测试、打包等)动态调整 classpath 内容。

例如,在编译时,Maven 会到 src/main/java 目录下寻找 Java 源码,并寻找在 pom 文件中 scope 为 compile 的依赖项,然后执行编译。

思考:Maven 生命周期的不同的阶段(phase)分别使用哪种 classpath?

Maven 的构建生命周期由一系列的阶段(phases)组成,每个阶段对应着特定的任务。Maven 根据当前所处的构建阶段动态调整 classpath,以确保每个阶段都能访问到所需的类和资源。以下是 Maven 构建生命周期中一些关键阶段及其对应的 classpath 类型:

(1) validate

  • Classpath:基本不需要额外的 classpath,主要用于验证项目配置是否正确。
  • 说明:这个阶段通常不涉及编译或运行代码,所以不会使用特定的 classpath。

(2) compile

  • Classpath:
    • 包括 src/main/java 和 src/main/resources。
    • 包括所有标记为 compile 范围的依赖项。
  • 说明:在这个阶段,Maven 编译项目的主源代码,并将编译后的类文件输出到 target/classes 目录下。

(3) test-compile

  • Classpath:
    • 包括 src/test/java 和 src/test/resources。
    • 包括所有标记为 compile 和 test 范围的依赖项。
  • 说明:编译测试代码,并将编译后的类文件输出到 target/test-classes 目录下。

(4) test

  • Classpath:
    • 包括 target/classes 和 target/test-classes。
    • 包括所有标记为 compile 和 test 范围的依赖项。
  • 说明:执行单元测试,确保代码质量。测试框架(如 JUnit 或 TestNG)会根据此 classpath 加载必要的类和资源。

(5) package

  • Classpath:
    • 主要基于 target/classes 中的内容。
    • 包括所有标记为 compile 和 runtime 范围的依赖项(具体取决于打包类型)。
  • 说明:创建可分发的包(如 JAR、WAR),并将其放置在 target 目录中。对于某些打包类型(如 WAR),还会包括 WEB-INF/lib 下的依赖。

(6) integration-test

  • Classpath:
    • 包括 target/classes 和 target/test-classes。
    • 包括所有标记为 compile、test 和 runtime 范围的依赖项。
  • 说明:部署打包好的应用程序到集成测试环境中,并执行集成测试。这通常涉及到更复杂的环境设置,例如启动应用服务器等。

(7) verify

  • Classpath:
    • 与 test 阶段类似,但可能包含更多运行时依赖。
  • 说明:运行任何检查工具来验证集成测试的结果,确保满足发布标准。

(8) install

  • Classpath:
    • 主要用于将打包好的工件安装到本地仓库。
  • 说明:这个阶段通常不需要特别的 classpath,因为它主要是为了更新本地仓库中的元数据

(9) deploy

  • Classpath:
    • 用于将打包好的工件部署到远程仓库。
  • 说明:类似于 install,但它将工件上传到一个或多个远程仓库,以便其他项目可以引用它们。
相关推荐
5pace1 天前
【JavaWeb|第一篇】Maven篇
java·maven
半梦半醒*1 天前
Jenkins流水线项目发布
运维·ci/cd·tomcat·jenkins·maven·运维开发
一只游鱼1 天前
maven简介与安装
java·maven
考虑考虑1 天前
解决idea导入项目出现不了maven
java·后端·maven
敲代码的嘎仔1 天前
JavaWeb零基础学习Day4——Maven
java·开发语言·学习·算法·maven·javaweb·学习方法
陈小桔2 天前
idea中重新加载所有maven项目失败,但maven compile成功
java·maven
自由会客室2 天前
Ubuntu 24.04 上安装 Sonatype Nexus Repository(Maven 私服)
架构·maven
哞哞不熬夜2 天前
JavaEE--SpringIoC
java·开发语言·spring boot·spring·java-ee·maven
TT哇2 天前
【Maven】Maven设置国内源
java·maven
编啊编程啊程3 天前
【011】宠物共享平台
spring boot·log4j·maven·dubbo·宠物