什么是maven?什么又是 spring
发布时间:2024-10-12 22:44:15
什么是maven?
Maven是apache旗下的开源项目,是一款用于管理和构建java项目的工具。
maven的作用?
用于管理依赖jar包,避免版本冲突。
在IDEA里创建Maven项目
这些 Archetype 的区别
maven-archetype-archetype 用于创建一个新的 Archetype 项目本身,主要用于定制自己的项目模板。 生成的结构通常不包含具体的代码目录(如 src 和 main),而是一个空的模板项目框架。 maven-archetype-j2ee-simple 用于创建简单的 J2EE 项目。 包含适合 J2EE 开发的文件结构和依赖配置。 maven-archetype-plugin 用于创建一个新的 Maven 插件项目。 生成的是一个用于开发自定义 Maven 插件的项目结构,包括 src/main/java 和 src/main/resources 目录。 maven-archetype-plugin-site 用于生成 Maven 插件网站的框架。 适合为你的插件项目生成站点内容。 maven-archetype-portlet 用于创建 Java Portlet 项目,常用于构建基于门户网站的 Portlet 应用。 生成的项目结构通常包含 Portlet 开发相关的依赖和配置。 maven-archetype-profiles 用于创建包含 Maven Profiles(配置文件)的项目。 适合需要在不同环境下(如开发、测试、生产)进行切换的项目。 maven-archetype-quickstart 这是最常用的基础 Java 项目模板,适合简单的 Java 应用程序。 默认会生成 src/main/java 和 src/test/java 目录,用于放置主程序和测试代码。 maven-archetype-site 用于创建一个用于生成 Maven 项目站点的项目。 适合为项目生成带有文档的静态网站。 maven-archetype-site-simple 是 maven-archetype-site 的简化版本。 提供一个简单的项目站点生成结构。 maven-archetype-webapp 用于创建 Java Web 应用项目。 生成的结构包括 src/main/webapp 目录,适合开发 Web 应用程序。
总结
如果你需要创建一个标准的 Java 项目结构,可以使用 maven-archetype-quickstart。如果是 Web 项目,则选择 maven-archetype-webapp。不同的 Archetype 会根据项目类型生成相应的文件结构。
Maven项目Pom.xml配置
maven项目配置jar包方法
在文件根目录的pom.xml里配置,jar包
<dependencies>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>//默认下载版本
</dependency>
</dependencies>
文件每段信息含意义
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- Maven项目的根元素,定义了项目的基本结构和配置。POM文件需要遵循4.0.0版本的POM XML架构 -->
<modelVersion>4.0.0</modelVersion>
<!-- groupId: 项目或组织的唯一标识符,通常是域名的反写形式,例如公司名或组织名 -->
<groupId>com.liuxin</groupId>
<!-- artifactId: 当前项目的唯一标识符,在同一groupId下应保持唯一,例如项目名或模块名 -->
<artifactId>Maven</artifactId>
<!-- version: 项目的版本号,用于发布不同版本的包。SNAPSHOT表示这是一个开发版本 -->
<version>1.0-SNAPSHOT</version>
<!-- packaging: 打包类型,定义项目打包成何种格式。默认为jar,可以是war(用于Web项目)、pom(用于父项目)等 -->
<packaging>jar</packaging>
<!-- name: 项目名称,用于展示和文档中显示。非必填项,可以不包含空格 -->
<name>Maven</name>
<!-- url: 项目主页地址,通常用于展示项目的信息。可以是项目仓库地址或文档链接 -->
<url>http://maven.apache.org</url>
<properties>
<!-- properties: 定义项目的通用属性,比如编译时的源文件编码。可以在POM文件中引用这些属性 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- dependencies: 定义项目的依赖库和版本。Maven会自动下载依赖并打包到项目中 -->
<dependency>
<!-- groupId: 依赖库的组织或公司名,唯一标识依赖的所属组织 -->
<groupId>junit</groupId>
<!-- artifactId: 依赖库的名称,唯一标识某个依赖 -->
<artifactId>junit</artifactId>
<!-- version: 依赖的版本号。建议指定明确的版本,避免版本冲突或不兼容 -->
<version>3.8.1</version>
<!-- scope: 依赖的作用域,控制依赖在不同构建阶段的使用范围
- compile(默认): 所有阶段都需要的依赖
- test: 仅在测试阶段使用
- provided: 编译和测试时需要,但运行时不包含
- runtime: 仅在运行和测试时需要
- system: 指定本地系统的路径,不下载 -->
<scope>test</scope>
</dependency>
</dependencies>
</project>
注意:Maven的依赖具有传递性
如何阻止依赖传递
在 Maven 中,当依赖项有自己的依赖时,会引入传递依赖。如果想阻止某些传递依赖,可以使用 <exclusions> 元素来排除特定的依赖。以下是几种常见的方法:
使用 <exclusions> 元素排除依赖
假设你的项目依赖 A,而 A 又依赖 B,但你不想在项目中引入 B,可以在 A 的依赖项中添加 <exclusions> 来排除 B:
<dependency>
<groupId>com.example</groupId>
<artifactId>A</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>com.example</groupId>
<artifactId>B</artifactId>
</exclusion>
</exclusions>
</dependency>
使用 <scope> 设置依赖的范围
有时,依赖传递不需要完全排除,而是只在某些阶段使用,比如仅用于测试。这种情况下可以使用 <scope> 限制范围:
主程序范围有效。(main文件夹范围内) 测试程序范围有效。(test文件夹范围内) 是否参与打包运行。(package指令范围内)
compile: 编译时和运行时都需要(默认值)。 test: 仅在测试时可用。 provided: 编译时需要但运行时不包含(如 Servlet API)。 runtime: 编译时不需要,仅在运行时可用。
<dependency>
<groupId>com.example</groupId>
<artifactId>A</artifactId>
<version>1.0</version>
<scope>runtime</scope>
</dependency>
使用 <dependencyManagement> 控制传递依赖的版本
在父 pom.xml 文件中使用 <dependencyManagement> 声明依赖,可以控制项目中传递依赖的版本,避免意外的版本升级。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>B</artifactId>
<version>1.1</version> <!-- 强制所有模块使用此版本 -->
</dependency>
</dependencies>
</dependencyManagement>
总结
排除特定传递依赖:使用 <exclusions>. 限制依赖的范围:使用 <scope>。 统一管理传递依赖版本:在 <dependencyManagement> 中声明。
这些方法可以帮助你有效地控制依赖关系。
Maven的生命周期
Maven 的生命周期是指 Maven 构建项目的整个过程,从开始到结束的多个阶段的执行顺序。Maven 将项目构建分为若干生命周期,每个生命周期包含一系列的构建阶段,这些阶段依次执行,完成项目的编译、测试、打包和部署等任务。
Maven 的三大生命周期
Maven 有三种主要的生命周期,每种生命周期包含一组构建阶段。三大生命周期分别是:
clean 生命周期:用于清理项目的生成文件。 default 生命周期:核心生命周期,负责项目的构建和部署。 site 生命周期:用于生成项目的站点文档。
1. clean 生命周期
clean 生命周期有三个阶段,通常用于清理项目构建生成的临时文件、旧的输出文件等。
pre-clean:执行清理前的准备工作。 clean:删除上一次构建生成的文件(例如 target 目录下的文件)。 post-clean:执行清理后的收尾工作。
示例:执行 mvn clean 会触发 clean 生命周期,从而删除 target 目录。
2. default 生命周期
default 生命周期是 Maven 的核心生命周期,负责管理项目的构建、测试、打包和部署等阶段。它包含多个阶段,最常用的阶段有以下几个:
validate:验证项目是否正确,检查所需信息是否完整。 initialize:初始化项目的构建状态,例如设置属性。 generate-sources:生成项目的源代码。 process-sources:处理项目的源代码,例如代码转换。 generate-resources:生成项目的资源文件。 process-resources:复制和处理资源文件到输出目录(例如 src/main/resources 到 target/classes)。 compile:编译项目的源代码。 process-classes:处理编译生成的字节码文件(例如字节码增强)。 generate-test-sources:生成测试源代码。 process-test-sources:处理测试源代码。 generate-test-resources:生成测试资源文件。 process-test-resources:复制和处理测试资源文件到输出目录。 test-compile:编译测试源代码。 test:运行测试用例,确保代码正确。 prepare-package:在打包之前进行必要的准备工作。 package:将编译后的代码打包成分发格式(如 JAR、WAR)。 pre-integration-test:在集成测试之前执行操作。 integration-test:执行集成测试,通常会在特定的环境中部署代码进行测试。 post-integration-test:集成测试完成后的操作。 verify:运行检查,确保代码符合质量标准。 install:将打包的文件安装到本地仓库,以便本地其他项目使用。 deploy:将最终的构建产物发布到远程仓库,以供其他开发人员和项目使用。
3. site 生命周期
site 生命周期负责生成和发布项目的文档。主要阶段有:
pre-site:执行生成站点文档之前的准备工作。 site:生成项目的站点文档。 post-site:执行生成站点文档之后的收尾工作。 site-deploy:将生成的站点文档发布到服务器上。
执行生命周期的示例
当你在命令行运行 mvn clean install 时,Maven 将依次执行以下步骤:
clean 生命周期:执行 pre-clean、clean 和 post-clean。 default 生命周期:从 validate 到 install 的所有阶段。
Maven 将根据指定的阶段依次执行所有前面的阶段。例如,执行 mvn package 会自动运行到 package 阶段所需的所有前置阶段(从 validate 到 package)。
注意事项
按需执行:每个生命周期不一定每个项目都需要完整执行。可以根据项目需求执行其中的某些阶段。
插件执行:在各个阶段,Maven 会根据配置的插件来执行具体的任务,例如使用 maven-compiler-plugin 在 compile 阶段编译代码。
生命周期的独立性:每个生命周期是独立的,运行 clean 生命周期不会自动触发 default 生命周期,反之亦然。
最重要的5个阶段:
clean:移除上一次构建生成的文件 compile:编译项目源代码 test:使用合适的单元测试框架运行测b试(junit) package:将编译后的文件打包,如:jar、war等 install:安装项目到本地仓库
什么是Spring?
Spring 是一个轻量级的 Java 企业级框架,旨在简化开发并提高代码的可维护性。其核心特性包括:
依赖注入 (DI):通过 IoC 容器自动管理对象依赖关系,减少代码耦合。 面向切面编程 (AOP):将日志、事务等横切关注点与业务逻辑解耦,提升代码复用性。 事务管理:提供声明式事务管理,便于数据库和 ORM 框架的集成。
Spring 主要模块包括:
Spring Core:提供 DI 支持,是整个框架的基础。 Spring MVC:基于 MVC 模式的 Web 框架,简化 Web 应用开发。 Spring Data:提供一致的数据访问接口,支持 JPA、MongoDB 等。 Spring Boot:简化配置和部署,让开发更高效。 Spring Cloud:支持微服务架构的分布式开发。
Spring 适用于企业级应用、Web 应用、微服务架构和数据访问。它凭借解耦设计、模块化架构和丰富的集成生态,成为 Java 开发的主流选择。
SpringBoot项目创建
选择Spring Initializr,配置对应信息 选择需要加载的Spring框架
SpringBoot项目pox.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- XML声明,定义文件使用UTF-8编码 -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- Maven POM文件的根元素,定义了XML命名空间 -->
<modelVersion>4.0.0</modelVersion>
<!-- 指定Maven模型的版本,目前通用4.0.0 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.5</version>
<relativePath/> <!-- 从仓库查找parent的路径,不写默认为根目录 -->
</parent>
<!-- 父项目:定义依赖的版本和默认配置,Spring Boot项目常用的基础POM -->
<groupId>com.liuxin</groupId>
<!-- 项目的组ID,用于唯一标识项目的组织 -->
<artifactId>springBoot</artifactId>
<!-- 项目的唯一ID,即包名,构成项目的全名 -->
<version>0.0.1-SNAPSHOT</version>
<!-- 项目版本,SNAPSHOT表示不稳定开发版本 -->
<name>springBoot</name>
<!-- 项目的名称,通常用于描述应用的基本信息 -->
<description>springBoot</description>
<!-- 项目描述,简述项目的功能和作用 -->
<url/>
<!-- 项目的主页URL,通常用于链接到项目的文档或GitHub页面 -->
<licenses>
<license/>
</licenses>
<!-- 软件许可证信息,包含许可名、URL、描述等,便于他人了解如何使用该项目 -->
<developers>
<developer/>
</developers>
<!-- 开发者信息:用于记录开发团队的姓名、邮箱、URL等 -->
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<!-- 源码管理配置(SCM),包括代码库链接、开发者连接和标记等 -->
<properties>
<java.version>21</java.version>
</properties>
<!-- 定义Java版本,用于兼容检查 -->
<dependencies>
<!-- 定义项目的依赖项,以下是常用依赖包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- spring-boot-starter-web:Spring Boot的Web模块依赖包,包含Spring MVC、Tomcat等 -->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<!-- 测试依赖包,包含JUnit、Mockito等,scope为test表示仅在测试阶段使用 -->
</dependency>
</dependencies>
<build>
<!-- 构建配置项,定义插件和编译设置 -->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- spring-boot-maven-plugin:用于打包和运行Spring Boot应用的核心插件 -->
</plugin>
</plugins>
</build>
</project>
关键难点说明
<parent>节点:定义了 spring-boot-starter-parent 作为父项目,统一管理依赖的版本。这里的父项目决定了项目中很多依赖的默认版本和配置,是构建简化的关键。 依赖管理: spring-boot-starter-web 和 spring-boot-starter-test 分别用于 Web 开发和测试。使用 starter 是 Spring Boot 的一大特性,自动带入所需库而无需手动配置。 spring-boot-maven-plugin: 这是 Spring Boot Maven 的核心插件,支持项目的打包和直接运行 spring-boot:run 命令来启动项目,非常适合开发环境。
这些配置构成了一个最基本的 Spring Boot POM 文件,使项目可以快速构建、打包并运行