一、初始Maven
Maven是一个项目管理工具,主要用于Java项目的管理。它提供了项目对象模型(POM),一个用于描述项目的基础、源代码、构建配置、依赖关系等信息的XML文件,使得开发人员能够使用统一的方式来构建和管理项目。
1、Maven的主要特点和功能
- 依赖管理: Maven通过坐标定位的方式自动下载和管理项目所需的依赖库,避免了手动下载和管理的繁琐过程,降低了项目的维护成本。
- 构建自动化: Maven内置了构建生命周期,支持项目的编译、测试、打包等构建过程,并提供了丰富的插件来扩展构建功能。
- 项目信息一致性: 通过POM文件,Maven可以确保项目的构建、报告和文档具有一致的信息。
- 跨平台性: Maven使用Java编写,因此可以在任何支持Java的平台上运行,具有良好的跨平台性。
- 多模块管理: Maven支持多模块项目的管理,使得大型项目可以分解为多个子模块,每个子模块都可以独立构建和管理。
2、Maven的使用流程
- 创建POM文件: 在项目根目录下创建一个名为pom.xml的文件,用于描述项目的基本信息和依赖关系。
- 配置依赖关系: 在POM文件中配置项目所需的依赖库,Maven会自动下载并管理这些依赖库。
- 执行构建命令: 使用Maven提供的命令行工具或集成开发环境(IDE)中的Maven插件执行构建命令,如编译代码、运行测试、打包应用程序等。
Maven可以更加高效地进行Java项目的开发和管理,减少重复劳动和错误,提高开发效率和质量。
3、为什么使用Maven
- Maven可以管理jar文件。
- 自动下载jar和他的文档,源代码。
- 管理jar直接的依赖, a.jar需要b.jar , maven会自动下载b.jar。
- 管理你需要的jar版本。
- 帮你编译程序,把java编译为class。
- 帮你测试你的代码是否正确。
- 帮你打包文件,形成jar文件,或者war文件。
- 帮你部署项目。
二、Maven工具的安装和配置
- 1、从Maven的官网下载Maven的安装包,版本可选择
apache-maven-3.3.9-bin.zip
,该版本配合jdk1.8
。 - 2、解压安装包,解压到一个目录,非中文目录。
- 子目录bin:用于执行程序,主要是
mvn.cmd
。 - 子目录conf:Maven工具本身的配置文件
settings.xml
。 - 3、配置环境变量,在系统的环境变量中,指定一个
M2_HOME
的名称, 指定它的值是Maven工具安装目录。 - 例如:
M2_HOME=D:\work\maven_work\apache-maven-3.3.9
。 - 再把M2_HOME加入到path之中,在所有路径之前加入
%M2_HOME%\bin
。 - 注意:需要配置
JAVA_HOME
,指定jdk路径。 - 4、验证,新的命令行中,执行
mvn -v
。
出现如下内容,maven安装,配置正确。
具体操作步骤可以查看:Maven安装与配置
三、Maven构建
Maven构建是一个自动化的项目构建过程,它基于项目对象模型(POM)来管理项目的构建生命周期、依赖关系以及插件等。
- 项目对象模型(POM): POM是Maven项目的核心配置文件,通常命名为pom.xml。它包含了项目的基本信息、依赖关系、构建配置等。通过POM文件,Maven能够理解项目的结构和需求,从而执行相应的构建操作。
- 构建生命周期: Maven定义了标准的构建生命周期,包括清理(clean)、编译(compile)、测试(test)、打包(package)、集成测试(integration-test)、验证(verify)、安装(install)和部署(deploy)等阶段。每个阶段都有特定的目标,并且按照顺序执行。开发人员可以通过执行Maven命令来触发这些阶段的执行。
- 依赖管理: Maven通过解析POM文件中的依赖关系,自动下载和管理项目所需的库和依赖项。它可以从本地仓库、中央仓库或远程仓库中获取这些依赖,并将其添加到项目的构建路径中。这使得开发人员无需手动管理依赖库,减少了项目中的冲突和错误。
- 插件执行: Maven的构建过程是通过插件来执行的。插件是Maven的核心组件,用于执行构建生命周期中的各个阶段的具体任务。Maven提供了大量的内置插件,并且还支持自定义插件的扩展。开发人员可以在POM文件中配置插件的使用,以满足项目的特定需求。
当执行Maven构建时,Maven会根据POM文件中的配置和依赖关系,按照构建生命周期的顺序执行相应的插件任务。例如,编译阶段会执行编译源代码的任务,测试阶段会运行项目的测试用例,打包阶段会将项目打包成可执行的JAR文件或WAR文件等。
1、Maven构建的生命周期
Maven构建的生命周期是Maven实现自动化构建的基础,它定义了一系列有序的构建阶段(phase),每个阶段都有特定的目标和任务。这些阶段按照预设的顺序依次执行,以完成整个项目的构建过程。
Maven构建的生命周期可以分为以下三大类:
Clean生命周期:
- clean: 清理项目产生的所有文件,如编译产生的class文件、测试产生的结果文件等。这个生命周期的目的是确保构建环境是干净的,以便进行下一次的构建。
Default生命周期(这是Maven最常用的生命周期):
- validate: 验证项目是否正确,以及所有必需的信息是否可用。
- compile: 编译项目的源代码。
- test: 使用适合的单元测试框架运行测试。这些测试不应该要求代码被打包或部署。
- package: 将编译后的代码打包成可发布的格式,如JAR、WAR等。
- verify: 运行任何检查来验证包是否有效且满足质量标准。
- install: 将包安装到本地仓库,以便本地的其他项目可以使用。
- deploy: 将最终的包复制到远程仓库,以供其他开发人员和项目使用。
Default生命周期是最核心的生命周期,它涵盖了从编译、测试到打包、部署等完整的构建流程。
Site生命周期:
- pre-site: 执行一些生成站点报告之前的处理。
- site: 生成项目的站点文档。
- post-site: 执行一些生成站点报告之后的处理。
- site-deploy: 将生成的站点文档部署到特定的服务器。
Site生命周期主要用于生成和发布项目站点,帮助开发人员和用户了解项目的文档、报告和相关信息。
2、Maven生命周期的作用
- 标准化构建流程: 通过定义有序的构建阶段,Maven确保项目的构建过程是一致的,减少了不同开发人员或不同构建环境之间的差异。
- 自动化构建: Maven能够自动执行构建生命周期中的各个阶段,无需开发人员手动干预,提高了构建效率。
- 扩展性: Maven允许通过插件来扩展构建生命周期,开发人员可以根据项目需求添加自定义的构建任务。
- 依赖管理: Maven在构建过程中能够自动管理项目的依赖关系,确保所有必要的依赖库都被正确引入。
Maven的生命周期提供了一种标准化、自动化和可扩展的项目构建机制,帮助开发人员高效地构建和管理Java项目。
通过Maven构建,可以确保项目的构建过程是一致和可重复的,减少了手动构建过程中的错误和不确定性。同时,Maven的标准化和自动化特性也提高了开发效率,使得团队之间的协作更加顺畅。
四、Maven核心概念
1、Maven的核心概念主要包括
- POM(Project Object Model,项目对象模型): POM是Maven项目的核心配置文件,通常以XML格式编写并命名为pom.xml。它位于项目的根目录下,包含了项目的基本信息、坐标、依赖关系、构建插件、资源目录等配置信息。POM定义了项目的结构和构建规则,控制Maven构建项目的过程,管理项目的依赖关系。
- 坐标: 坐标是一个唯一的字符串,用于在Maven的仓库中定位项目或依赖。它由groupId、artifactId和version三个元素组成,类似于我们在超市中找到商品的唯一标识。
- 依赖管理: Maven通过坐标来管理项目的依赖关系,自动下载和管理项目所需的库和依赖项。这避免了手动下载和配置依赖的繁琐过程,降低了项目的维护成本。
- 仓库管理: Maven仓库用于存储项目的构建结果、依赖库和其他资源。它分为本地仓库和远程仓库,本地仓库是开发人员机器上的一个目录,用于缓存下载的依赖和构建产生的文件;远程仓库则是一个中心化的资源存储库,可以供多个开发人员共享。
- 构建生命周期: Maven定义了一套标准的构建生命周期,包括清理、编译、测试、打包、安装、部署等阶段。这些阶段按照预定的顺序执行,以完成项目的构建和发布。
- 插件: Maven的插件是执行构建任务的工具,它们可以在构建生命周期的各个阶段中执行特定的任务,如编译代码、运行测试、生成文档等。Maven提供了大量的内置插件,并且还支持自定义插件的扩展。
这些核心概念共同构成了Maven的核心功能,使得Maven能够成为一个强大的项目管理工具,帮助开发人员高效地构建和管理Java项目。
2、Maven约定的目录结构
每一个Maven项目在磁盘中都是一个文件夹(项目-Hello)
Hello/
---/src
------/main # 放你主程序java代码和配置文件
----------/java # 你的程序包和包中的java文件
----------/resources # 你的java程序中要使用的配置文件
------/test # 放测试程序代码和文件的(可以没有)
----------/java # 测试程序包和包中的java文件
----------/resources # 测试java程序中要使用的配置文件
---/pom.xml # Maven的核心文件(Maven项目必须有)
3、Maven下载依赖
疑问: 使用mvn compile命令会编译src/main目录下的所有java文件,并同时会检查文件完整,会下载插件。
Maven工具执行的操作是需要很多插件(jar文件)完成的,下载的jar文件叫做插件,是完成某些功能的组件,内部是Java类。
下载的插件位置是默认仓库(本机仓库),是setting.xml
文件中的默认位置。
执行mvn compile, 结果是在项目的根目录下生成target目录(结果目录),Maven编译的Java程序,最后的.class文件都放在target目录中。
设置本机存放资源的目录位置(如何设置本机仓库):
- 修改maven的配置文件, Maven的安装目录在
/conf/settings.xml
文件中。 - 先备份
settings.xml
。 - 修改文件中
<localRepository>
的位置,指定你的目录(不要使用中文目录) - 例如:
D:\work\maven_work\maven_repository
4、仓库:存放Maven使用的jar包
仓库存放Maven使用的 jar包 和项目使用的 jar包
- Maven使用的插件(各种jar)
- 我项目使用的jar(第三方的工具)
仓库的分类:
- 本地仓库:就是个人计算机上的文件夹,存放各种jar。
- 远程仓库:在互联网上的,使用网络才能使用的仓库。
- 中央仓库:最权威的, 所有的开发人员都共享使用的一个集中的仓库。
- 中央仓库的镜像:就是中央仓库的备份, 在各大洲,重要的城市都是镜像。
- 私服:在公司内部,在局域网中使用的, 不是对外使用的。
Maven仓库的使用不需要人为参与,如果需要使用mysql驱动。
Maven首查本地仓库,再查私服,再查镜像,再查中央仓库,按照顺序一层一层查询。
你在写项目的中的用到的所有依赖(jar),必须在本地仓库中有。没有必须通过Maven下载, 包括provided的都必须下载。
你在servlet需要继承HttpServlet( provided) ,你使用的HttpServlet是Maven仓库中的。当你的写好的程序, 放到 tomat服务器中运行时, 此时你的程序中不包含servlet的jar,因为tomcat提供了 servlet的.jar
5、pom:项目对象模型
Maven的POM(Project Object Model,项目对象模型)是一个XML文件,通常命名为pom.xml,它是Maven项目的核心配置文件。POM定义了项目的所有属性,包括项目的名称、版本、依赖关系、构建配置等。使用pom.xml,我们可以轻松地管理项目的构建和依赖关系,从而更专注于业务逻辑的开发。
1、坐标:唯一值, 在互联网中唯一标识一个项目的
- groupId:项目或者组织的唯一标志,用于在Maven仓库中标识项目的位置。
- artifactId:项目的通用名称,通常用于生成项目的jar包名称。
- version:项目的版本号,用于标识项目的不同发布版本。
<groupId>公司域名的倒写</groupId>
<artifactId>自定义项目名称</artifactId>
<version>自定版本号</version>
2、packaging: 打包后压缩文件的扩展名
- packaging:项目的打包类型,如pom、jar、war等。这决定了项目的输出形式,例如,一个web应用可能会打包为war文件。
3、依赖:dependencies 和dependency
- dependencies:项目的依赖关系列表,用于指定项目所需的其他库或模块。每个依赖项都包含groupId、artifactId和version等属性。相当于是 java代码中import,你的项目中要使用的各种资源说明, 比如我的项目要使用mysql驱动:
<dependencies>
<!--依赖 java代码中 import -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
</dependencies>
4、properties:定义项目级别的属性
统一设置依赖中的属性,如上面的版本号,名字等。
5、build:构建配置
包括构建插件、源代码目录、输出目录。
6、依赖范围,使用scope表示
scope:表示依赖使用的范围,也就是在maven构建项目的那些阶段中起作用。scope的值有compile,test,provided,默认是compile
maven构建项目:编译、测试、打包、安装、部署 过程(阶段),根据scope可以设置在某个阶段某个依赖生效。
例如:junit的依赖范围是 test
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope> 测试的时候才有效
</dependency>
<dependency>
<groupId>a</groupId>
<artifactId>b</artifactId> b.jar
<version>4.11</version> 不写但也是全局使用,compile在每个阶段
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>servlet.jar
<scope>provided</scope> 提供者
</dependency>
7、modules、developers和licenses
- modules:对于多模块项目,这个属性用于列出子模块的路径。
- developers:项目开发人员的信息。
- licenses:项目的许可信息。
6、Maven插件
Maven插件是由Maven构建工具本身提供的,用于自动化和重复性的任务。插件是由Maven构建工具通过解析pom.xml文件中的插件配置来加载的。它们极大地扩展了Maven的核心功能,使得开发者能够更方便地进行项目构建、测试、打包等操作。
Maven插件由三部分组成,分别是Mojo类、Goal类和Pom类。Mojo类是插件的核心,它包含了插件的主要逻辑;Goal类是Mojo类的实现,它定义了插件的目标;Pom类则用于配置插件的元数据。
Maven为大多数构建步骤编写并绑定了默认插件。例如,针对编译的插件有maven-compiler-plugin,针对测试的插件有maven-surefire-plugin等。这些插件在大多数情况下都能满足开发者的需求,但当有特殊需要时,也可以配置插件以定制构建行为,甚至自己编写插件。
插件可以在自己的项目中设置,最常使用的是maven编译插件。设置项目使用的 jdk 版本时通过编译插件指定。pom.xml
文件<build>
中设置。
<build>
<!-- 配置插件 -->
<plugins>
<!-- 配置具体的插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<!-- 插件的名称 -->
<artifactId>maven-compiler-plugin</artifactId>
<!-- 插件的版本 -->
<version>3.8.1</version>
<!-- 配置插件的信息 -->
<configuration>
<!-- 告诉maven 我们写的代码实在jdk1.8上面编译的 -->
<source>1.8</source>
<!-- 我们的程序应该运行在1.8的jdk上 -->
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
7、单元测试junit
单元测试(测试方法):用的是junit, junit是一个专门测试的框架(工具)。
junit测试的内容: 测试的是类中的方法, 每一个方法都是独立测试的。方法是测试的基本单位(单元),判断你类是否正确,可以测试你的每一个方法是否达到了预期功能。Maven借助单元测试,批量的测试你类中的大量方法是否符合预期的。
首先加入依赖,在pom.xml加入单元测试依赖:
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
在maven项目中的src/test/java目录下,创建测试程序。 推荐的创建类和方法的提示:
- 测试类的名称:Test + 你要测试的类名
- 测试的方法名称:Test + 方法名称
例如你要测试HelloMaven,创建测试类 TestHelloMaven。
@Test
public void testAdd(){
// 测试HelloMaven的add方法是否正确
}
其中testAdd叫做测试方法,它的定义规则
- 方法是public的,必须的
- 方法没有返回值, 必须的
- 方法名称是自定义的,推荐是Test + 方法名称
- 在方法的上面加入 @Test
然后运行测试方法,查看测试结果。
8、资源插件
默认没有使用resources的时候, Maven执行编译代码时, 会把 src/main/resource
目录中的文件拷贝到 target/classes
目录中。对于 src/main/java
目录下的非java文件不处理,不拷贝到 target/classes
目录中。
程序有时候需要把一些文件放在 src/main/java
目录中,当在执行 Java程序时,需要用到 src/main/java
目录中的文件,需要告诉Maven在 mvn compile
src/main/java
目录下的程序时,需要把文件一同拷贝到 target/classes
目录中。此时就需要在 <build>
中加入 <resources>
。
<build>
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的.properties.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<!—filtering 选项 false 不启用过滤器, *.property 已经起到过滤的作用了 -->
<filtering>false</filtering>
</resource>
</resources>
</build>
五、Maven与IDEA
在IDEA中设置Maven,让IDEA和Maven结合使用。IDEA中内置了Maven,一般不使用内置的, 因为用内置修改IDEA的设置不方便。使用自己安装的Maven, 需要覆盖IDEA中的默认的设置。
1、确保机器上安装了Maven。
2、确保Maven在机器上的环境已经正确配置。
前两步可以参照安装和配置章节。
3、确保IDEA正确配置了Maven的地址。
- 打开IDEA左上角file功能,弹出后,在搜索框搜索Maven。
- 需要配置:
- Maven home path:Maven项目的安装路径。
- User settings file:
settings.xml
文件位置,一般为安装路径下的conf/settings.xml
位置。 - Local repository: 本地仓库,在
settings.xml
文件中配置好的仓库路径。 - 注意jdk的配置。
- 配置好之后,启动项目。