目录
resources 插件 maven-resources-plugin
compile 插件 maven-compiler-plugin
deploy 发布插件 maven-install-plugin
开发时为什么需要maven:
软件开发需要编译代码—>开发人员自己测试代码—>把代码打包—>部署项目到测试服务器—>测试人员测试功能—>测试测试出 bug
开发人员需要修改bug—>开发人员自己测试代码—>把代码打包—>部署项目到测试服务器—>测试人员测试功能—>直到符合功能要求。
上述过程需要重复多次,大型项目中构建项目比较复杂,有很多的配置文件,jar 文件,多个子项目等等。都用人力完成费时费力,效率比较低。maven 可以让我们从上面的工作中解脱出来。
maven 是自动化构建工具
Maven的下载地址:
Maven的优势:
(1)maven可以管理jar文件。
(2)自动下载jar及其文档、源代码。
(3)管理jar直接的依赖, 如a.jar需要b.jar , maven会自动下载b.jar。
(4)管理你需要的jar版本。
(5)帮你编译程序,将所有java文件一并编译为class文件。
(6)帮你测试你的代码是否正确。
(7)帮你打包文件,形成jar文件,或者war文件。
(8)帮你部署项目。
Maven项目的构建:
构建是面向过程的,就是一些步骤,完成项目代码的编译,测试,运行,打包,部署等等。
maven支持的构建包括有:
1、清理,删除以前的编译结果,为重新编译做好准备。
2、编译,把程序源代码编译为执行代码。
3、测试, maven可以执行测试程序代码,验证你的功能是否正确。maven可以同时执行多个测试代码,同时测试很多功能。
4、报告,在每一次测试后以标准的格式记录和展示测试结果。
5、打包,把你的项目中所有的class文件,配置文件等所有资源放到一个压缩文件中。这个压缩文件就是项目的结果文件,通常java程序的压缩文件是jar扩展名的。而对于web应用,压缩文件扩展名是.war。
6、安装,在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中。
7、部署,将打包的结果部署到远程仓库或将war包部署到服务器上运行。
maven核心概念:
①POM:一个文件名称是pom.xml,pom翻译过来叫做项目对象模型。 maven把一个项目当做一个模型使用。通过这个文件可以控制maven,管理jar依赖。
②约定的目录结构:maven项目的目录和文件的位置都是规定的。
③坐标:是一个唯一的字符串,用来表示资源的。
④依赖管理:管理你的项目可以使用jar文件。
⑤仓库管理(了解):你的资源存放的位置。
⑥生命周期 (了解) :maven工具构建项目的过程,就是生命周期。
⑦插件和目标(了解):执行maven构建的时候用的工具是插件。
⑧继承
⑨聚合
不使用idea情况下maven工具的安装和配置:
(1)需要从maven的官网下载maven的安装包。
(2)解压安装包,解压到一个目录(非中文目录)。
子目录 bin中:执行程序,主要是mvn.cmd
conf 目录中 :maven工具本身的配置文件 settings.xml
(3)配置环境变量
在系统的环境变量中,指定一个M2_HOME的名称, 指定它的值是maven工具安装目录(bin目录的上一级)
如M2_HOME=D:\work\maven_work\apache-maven-3.3.9
再在path中添加maven的bin目录的绝对路径即可。
(4)验证。在DOS窗口中,执行mvn -v,若没报错则配置成功。
注意:环境变量中需有JAVA_HOME这一属性,并指定jdk的路径。
Maven约定的目录结构(以名为Hallo的项目为例):
src:源代码
main:主程序
java:主程序的 java 源码
resources:主程序的配置文件
test:测试程序 (可以没有)
java:测试程序的 java 源码
resources:测试程序的配置文件
pom.xml:Maven 工程的核心配置文件。(maven项目必须有)
仓库
(1)仓库是什么: 仓库是存放东西的, 存放maven使用的jar 和 我们项目使用的jar。
①:maven使用的插件(各种jar)
②:我项目使用的jar(第三方的工具)(MySQL的驱动等)
(2)仓库的分类:
①:本地仓库, 就是你的个人计算机上的文件夹,存放各种jar
②:远程仓库, 在互联网上的,使用网络才能使用的仓库
(3)远程仓库又分为:
①:中央仓库,最权威的, 所有的开发人员都共享使用的一个集中的仓库,https://repo.maven.apache.org :中央仓库的地址。
②:中央仓库的镜像:就是中央仓库的备份, 在各大洲,重要的城市都有镜像。
③:私服,在公司内部,在局域网中使用的, 不是对外使用的。
(4)仓库的使用,maven仓库的使用不需要人为参与。
如:开发人员需要使用mysql驱动 ---> maven首先查本地仓库 ---> 没有则去私服查找 ---> 没有则去镜像查找 ---> 没有则取中央仓库查找
设置本机存放资源的目录位置(设置本机仓库):
1. Maven本地仓库默认位置
一旦我们安装了Maven的,默认情况下,Maven的本地仓库被配置为“ ${user.home}/.m2/repository”。
在不同的操作系统中,这些路径被解析为
Windows 7:C:/Documents and Settings/<用户名>/.m2/repository
Windows 10:C:/Users/<用户名>/.m2/repository
Linux:/home/<用户名>/.m2/repository
Mac:/Users/<用户名>/.m2/repository
由于各种原因,我们可能希望将此位置更改为另一条路径。例如,我们可能希望节省存储空间C:\并将下载的文件存储在另一个驱动器中。
2. 更改本地存储库位置
①:修改maven的配置文件, 配置文件位于maven安装目录下/conf/settings.xml。
②:修改 <localRepository> 指定你的目录(不要使用中文目录)
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository -->
<!-- 配置本地仓库位置 -->
<localRepository>A:/Maven_Download</localRepository>
...
...
</settings>
pom文件:
(1)坐标:在互联网中一个项目的唯一标识,具有唯一性。
<groupId>公司域名的倒写</groupId>
<artifactId>自定义项目名称</artifactId>
<version>自定版本号</version>
https://mvnrepository.com/ 是搜索使用的中央仓库, 可使用 groupId 或者 artifactId作为搜索条件搜索所需的依赖坐标。
(2)packaging: 打包后压缩文件的扩展名,若不写则默认是jar ,web应用是war。
(3) 依赖:dependencies 和dependency,是项目中所要使用的各种资源说明,如我的项目要使用mysql驱动,则:
<dependencies>
<!--依赖 java代码中 import -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
</dependencies>
下载的依赖在我们的本地仓库中。
(4)properties:设置属性。
(5)build : maven在进行项目的构建时, 配置信息,例如指定编译java代码使用的jdk的版本等。
Maven生命周期:
对项目的构建是建立在生命周期模型上的,它明确定义项目生命周期各个阶段,并且对于每一个阶段提供相对应的命令,对开发者而言仅仅需要掌握一小堆的命令就可以完成项目各个阶段的构建工作。
构建项目时按照生命周期顺序构建,每一个阶段都有特定的插件来完成。不论现在要执行生命周期中的哪个阶段,都是从这个生命周期的最初阶段开始的。对于我们程序员而言,无论我们要进行哪个阶段的构建,直接执行相应的命令即可,无需担心它前边阶段是否构建,Maven 都会自动构建。这也就是 Maven 这种自动化构建工具给我们带来的好处。
maven的生命周期:就是maven构建项目的过程,包括清理,编译,测试,报告,打包,安装,部署。
Maven的命令:
Maven 对所有的功能都提供相对应的命令,要想知道 maven 都有哪些命令,那要看 maven 有哪些功能。
maven 有三大功能:管理依赖、构建项目、管理项目信息。
管理依赖,只需要声明就可以自动到仓库下载;管理项目信息其实就是生成一个站点文档,一个命令就可以解决。
maven 功能的主体其实就是项目构建。 Maven 提供一个项目构建的模型,把编译、测试、打包、部署等都对应成一个个的生命周期阶段,并对每一个阶段提供相应的命令,程序员只需要掌握一小堆命令,就可以完成项目的构建过程。
mvn clean 清理(会删除原来编译和测试的目录,即 target 目录,但是已经 install 到仓库里的包不会删除)
mvn compile 编译主程序(main文件夹)(会在当前目录下生成一个 target,里边存放编译主程序之后生成的字节码文件)
mvn test-compile 编译测试程序(test文件夹)(会在当前目录下生成一个 target,里边存放编译测试程序之后生成的字节码文件)
mvn test 测试(会生成一个目录surefire-reports,保存测试结果)
mvn package 打包主程序(会编译、编译测试、测试、并且按照 pom.xml 配置把主程序打包生成 jar 包或者 war 包)
mvn install 安装主程序(会把本工程打包,并且按照本工程的坐标保存到本地仓库中)
mvn deploy 部署主程序(会把本工程打包,按照本工程的坐标保存到本地库中,并且还会保存到私服仓库中。 还会自动把项目部署到 web 容器中)
注意:maven的命令要在pom.xml文件所在路径下的DOS窗口执行。
在pom.xml文件的路径下在DOS窗口中输入 mvn compile 即可编译src/main目录下所有的java文件。若电脑没用过maven,那么第一次编译时会下载大量文件。因为maven工具执行的操作需要很多插件(java类--jar文件)完成的。
下载的东西存放到默认仓库(本机仓库):C:\Users\(登录操作系统的用户名)Administrator\.m2\repository。
执行完mvn compile后, 项目的根目录下会生成target目录(结果目录),maven编译java程序生成的class文件都放在target目录中,main/resources目录下的所有文件也都拷贝到target/classes目录下(配置文件)。
maven的插件:
官网插件说明:http://maven.apache.org/plugins/。
单元测试(测试方法):
maven命令执行时,真正完成功能的是插件,插件就是一些jar文件, 一些类。
单元测试的插件用的是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目录下,创建测试程序。
推荐的测试类和测试方法的名称:
1、测试类的名称一般为:Test + 你要测试的类名。
2、测试方法名称一般为:Test + 方法名称。
测试方法的定义规则:
1.方法必须是public修饰。
2.方法必须没有返回值。
3.方法名称是自定义的,推荐是Test + 方法名称。
4.在方法的上面加入 @Test 注解。
clean 插件 maven-clean-plugin
clean 阶段是独立的一个阶段,功能就是清除工程目前下的 target 目录
resources 插件 maven-resources-plugin
resource 插件的功能就是把项目需要的配置文件拷贝到指定的目当,默认是拷贝 src\main\resources 目录下的件到classes 目录下。
compile 插件 maven-compiler-plugin
compile 插件执行时先调用 resouces 插件,功能就是把 src\mainjava 源码编译成字节码生成 class 文件,并把编译好的 class 文件输出到 target\classes 目录下
package 打包插件 maven-jar-plugin
这个插件是把 class 文件、配置文件打成一个 jar(war 或其它格式)包
deploy 发布插件 maven-install-plugin
发布插件的功能就是把构建好的 artifact 部署到本地仓库,还有一个 deploy 插件是将构建好的 artifact 部署到远程仓库。
配置插件
插件可以在自己的项目中设置,最常使用的是 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>
<!-- 告诉maven,我们的程序是运行在jdk1.8上的-->
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
在idea中设置maven:
idea中内置了maven ,一般不使用内置的, 因为用内置修改maven的设置不方便。可以使用自己安装的maven, 需要覆盖idea中的默认的设置,让idea指定maven安装位置、settings文件位置和本地仓库位置。
配置的入口
①:配置当前工程的设置, file ---> settings ---> Build, Excution,Deployment ---> Build Tools
---Maven
Maven Home directory:maven的安装目录(bin路径的上一级)。
User Settings File:指向maven安装目录 conf/setting.xml 配置文件。
Local Repository:本地仓库的目录位置。
---Build Tools--Maven--Runner
VM Options:-DarchetypeCatalog=internal,maven项目创建时,会联网下载模版文件,比较大, 使用-DarchetypeCatalog=internal,不用下载, 创建maven项目速度快。
JRE:你项目所使用的jdk
②:配置以后新建工程的设置, file ---> New Projects Setup ---> Setting for New Projects
同上。
创建maven工程:
使用模版创建项目:
(1)maven-archetype-quickstart:普通的java项目。
(2)maven-archetype-webapp:web工程。
注意,新创建出来的工程缺少这两个配置文件夹,需自行补上。
默认生成这两个类,没啥用,可直接删除。(测试程序与被测试程序应在同一个包目录名称下)(一个是main中的包,一个是tset中的包)
pom.xml文件:
<?xml version="1.0" encoding="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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!--版本号,固定的-->
<modelVersion>4.0.0</modelVersion>
<!--项目坐标-->
<groupId>org.example</groupId>
<artifactId>maven</artifactId>
<version>1.0-SNAPSHOT</version>
<!--packaging默认省略-->
<packaging>jar</packaging>
<!--项目的网页地址,非展示项目则可删-->
<name>maven</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<!--设置maven属性-->
<properties>
<!--说明构建maven项目时使用的是utf-8编码,避免中文乱码-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--编译java代码的jdk版本-->
<maven.compiler.source>1.8</maven.compiler.source>
<!--该项目运行的jdk版本-->
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!--依赖-->
<dependencies>
<!--单元测试依赖-->
<dependency>
<!--依赖坐标-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<!--依赖范围-->
<scope>test</scope>
</dependency>
</dependencies>
<!--插件管理,idea为了方便修改都列了出来,但有无均可-->
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
使用 idea 对 maven 进行操作:
在idea的右边有一个maven的入口,里面方便有maven的生命周期、插件信息和依赖信息。可以双击maven中的任一生命周期,会自动执行所对应的maven的代码。
idea 导入 maven 项目:
依赖的范围:
在依赖的定义语句中声明,使用scope表示的。
junit的依赖范围是 test:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
maven常用操作
maven自定义属性(全局变量)的方法:
1、在 <properties> 通过自定义标签声明变量(标签名就是变量名)
2、在 pom.xml 文件中的其它位置,使用 ${标签名} 使用变量的值。
自定义全局变量一般是定义依赖的版本号, 当你的项目中要使用多个相同的版本号,可以通过这种方式设置。这样当以后要修改版本号时,可以统一修改,方便。
例如:
<!--设置maven属性-->
<properties>
<!--说明构建maven项目时使用的是utf-8编码,避免中文乱码-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--编译java代码的jdk版本-->
<maven.compiler.source>1.8</maven.compiler.source>
<!--该项目运行的jdk版本-->
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.11</junit.version>
</properties>
<!--依赖-->
<dependencies>
<!--单元测试依赖-->
<dependency>
<!--依赖坐标-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<!--依赖范围-->
<scope>test</scope>
</dependency>
</dependencies>
资源插件
默认没有使用resources的时候, maven执行编译代码时, 会把src/main/resource目录中的文件拷贝到target/classes目录中。同时将Java程序编译后的class文件也拷贝到target/classes目录中,并保留包的结构不变。
而对于src/main/java目录下的非java文件不处理,不拷贝到target/classes目录中。
如果想吧src/main/java的资源文件也拷贝到target/classes目录下,需要在pom.xml文件中设置:
<build>
<resources>
<!--将src/main/resources目录下的所有资源文件打包-->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
<!—filtering 选项 false 不启用过滤器, *.property 已经起到过滤的作用了 -->
<filtering>false</filtering>
</resource>
<!--同时也将src/main/java目录下的xml文件打包-->
<resource>
<directory>src/main/java</directory>
<includes>
<!-- **表示java路径下的所有目录(文件夹),*.xml表示所有xml文件-->
<include>**/*.xml</include>
</includes>
<!—filtering 选项 false 不启用过滤器, *.property 已经起到过滤的作用了 -->
<filtering>false</filtering>
</resource>
</resources>
</build>
注意,maven会默认拷贝resources文件夹下的配置文件,但如果手动设置了拷贝java目录下的配置文件,则不会默认拷贝resources文件夹下的配置文件,需另外手动设置一下。