什么是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 文件,使项目可以快速构建、打包并运行