一个 基于Java平台 的 自动化构建工具 ,帮助咱们管理jar包和拆分项目,其余相似的构建工具备 make-ant-maven-gradle。html
基于Java平台:安装maven前必定要配置好JDK环境。java
自动化构建工具:eclipse就是自动化构建工具,帮助咱们把java编译为class文件。spring
(1)下载JDK并配置环境变量apache
(2)下载maven(http://maven.apache.org/download.cgi)api
(3)解压安装包,并配置maven环境变量tomcat
a、配置MAVEN_HOME : D:\apache-maven-3.6.3\bineclipse
b、配置path:%MAVEN_HOME%\binmaven
ide
以上三步就已经成功安装了maven,但为了让你的maven使用经历更加畅快,你还须要作出如下一些小修改。工具
(1)增长Maven镜像
Maven 仓库默认在国外, 国内使用不免很慢,咱们能够更换为阿里云的仓库。
Maven安装目录下,找 conf ----->settings.xml,在 mirrors 标签下加入下面内容
<mirror> <!--This sends everything else to /public --> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>
(2)修改本地仓库位置
Maven默认本地仓库地址在C盘,随着项目的增长,这无疑会使得C盘变的臃肿,能够修改C盘的路径。
Maven安装目录下,找 conf ----->settings.xml,修改 localRepository 标签中的地址到你开心的位置。
<localRepository>F:/soft/MVN_repository</localRepository>
(3)修改IDE的配置,使本地仓库生效
Eclipse:Windows---->Preferences---->Maven---->User Settings---->Global Settings选择你以前配置的settings.xml
Idea:File---->Settings---->Maven---->User settings file选择你以前配置的settings.xml
安装完成后,不要先着急使用,还有一些知识须要你进行了解,以便于你更好的使用Maven。
Maven生命周期总的来分为clean,build,site三大部分,其中build又依次包括validate--->compile--->Test--->package--->verify--->install--->deploy,本篇文章比较偏向于实践,具体的生命周期的知识笔者再也不赘述(生命周期的知识比较偏理论,但也挺重要的,仍是但愿你们自行了解下,https://www.runoob.com/maven/maven-build-life-cycle.html),生命周期的一些阶段对应着Maven的一些经常使用命令,
命令 | 描述 |
---|---|
mvn clean | 删除target目录(删除编译文件的目录) |
mvn compile | 只编译main目录中的java文件 |
mvn test | 执行test目录下的测试用例 |
mvn package | 将编译后的代码打包成可分发格式的文件,好比JAR、WAR或者EAR文件。 |
mvn install | 安装项目包到本地仓库,这样项目包能够用做其余本地项目的依赖 |
值得注意的是,每个命令执行时,该命令以前以及包括该命令在内的全部命令都会被执行,好比执行了mvn install,前边的五条命令也都会被执行。
为了方便理解,先对常见的pom文件结构进行讲解,掌握了下边的文件结构,基本上你就能够关掉本篇博文,使用maven进行开发了,但若是你对此并不知足,能够继续向下看。
<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"> <!--声明项目描述符遵循哪个POM模型版本。模型自己的版本不多改变,
虽然如此,但它仍然是必不可少的,这是为了当Maven引入了新的特性或者其余模型变动的时候,确保稳定性。 --> <modelVersion>4.0.0</modelVersion> <!-- 公司或者组织的惟一标志,而且配置时生成的路径也是由今生成,
如com.liu.learning,maven会将该项目打成的jar包放本地仓库下的:/com/liu/learning 目录下下--> <groupId>com.liu.learning</groupId> <!-- 项目的惟一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 --> <artifactId>HelloWorld01</artifactId> <!-- 版本号 --> <version>0.0.1-SNAPSHOT</version> <!--项目的名称, Maven产生的文档用 --> <name>HelloWorld01</name> <!--项目产生的构件类型,例如jar、war、ear、pom。 --> <packaging>jar</packaging> <!--项目描述 --> <description>hello world</description> <!-- 统一JDK版本 --> <profiles> <profile> <id>jdk-1.8</id> <activation> <activeByDefault>true</activeByDefault> <jdk>1.8</jdk> </activation> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> </properties> </profile> </profiles> <dependencies> <!-- https://mvnrepository.com/artifact/junit/junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <!-- jar包的做用范围,相关知识会摘出来单独讲解 --> <scope>test</scope> </dependency> </dependencies> </project>
经常使用的三个分别是compile,test,provided 做用范围以下表:
阶段 \ scope | compile | test | provided |
---|---|---|---|
编译 | √ | × | √ |
测试 | √ | √ | √ |
部署(运行) | √ | × | × |
缺省值,若是不显式声明默认为compile,适用于全部阶段,会随着项目一块儿发布。
jar包只在测试阶段须要,常见的jar好比说junit
jar包只在编译和测试时须要,这种比较少见,好比说servlet-api.jar,编译和测试时须要servlet 环境,但运行时由tomcat提供servlet环境,就不须要servlet-api.jar了
假如说咱们须要用到A.jar,可是A.jar中又用到了B.jar,Maven会自动帮咱们引入B.jar,最多见的例子就是spring-context.jar 了,你们能够自行尝试将下边依赖引入,Maven不只会将spring-context.jar引入,还会将spring-aop.jar,spring-beans.jar等其余jar包一并引入。
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.6.RELEASE</version> </dependency>
但若是咱们确实用不到其余jar但Maven又帮咱们引入了,那该怎们办呢?
<!-- 方法一 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.6.RELEASE</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> </exclusion> </exclusions> </dependency> <!-- 方法二 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.6.RELEASE</version> <exclusions> <exclusion> <groupId>*</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency>
在数学上,若A依赖于B,B依赖于C,那么A依赖于C成立,但在Maven中还须要添加一个条件,要使 A.jar依赖于C.jar,当且仅当 B.jar 依赖于C.jar的范围是compile。
建立maven项目A,B,其中B中引入junit.jar,而后将B用mvn install安装到本地仓库,再将B引入到A,改变junit的scope观察A中是否引入junit。
实验过程如上,读者可自行实验。
咱们再来看下边三个案例,
(1)同一POM中引入同一jar包的不一样版本时(不推荐这样作),会使用哪一个版本呢?
(2)项目A->B,B->junit.jar(scope为compile),同时A->junit.jar,那么A中又会使用哪一个jar呢?
(3)项目A依赖B和C,B和C都依赖了不一样版本的junit.jar(scope为compile),那么A中会使用哪一个jar呢?
前两个很好猜,第一个pom文件写在后边的jar会覆盖前边的jar。第二个会选择离本身最近的jar,也就是A中本身的jar。第三个同时也遵循 离本身最近的原则,可是二者距离同样,那怎么办呢?POM文件中对B和C的依赖声明总有前后顺序吧,那就采用先声明那个中的jar。
咱们抛去第一个案例(开发中严禁这样作),来总结下规则:
(1)路径最近者优先。
(2)第一声明者优先。
<!-- 第一步:父项目必须声明为pom --> <packaging>pom</packaging>
<!-- 第二步:dependencies外层套上dependencyManagement --> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>compile</scope> </dependency> </dependencies> </dependencyManagement>
<!-- 第一步:引入父项目的坐标 --> <parent> <groupId>com.liu.learing</groupId> <artifactId>parent</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 当前工程的Pom.xml到父工程的Pom.xml之间的 相对路径 --> <!-- 父项目的pom.xml文件的相对路径。相对路径容许你选择一个不一样的路径。默认值是../pom.xml。Maven首先在
构建当前项目的地方寻找父项 目的pom,其次在文件系统的这个位置(relativePath位置),而后在本地仓库,最后
在远程仓库寻找父项目的pom。 --> <relativePath>../parent/pom.xml</relativePath> </parent> <!-- 第二步:写出要用到父项目的jar包名称,不用写版本号 --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> </dependencies>
Maven项目可以识别自身和本地仓库中的项目,若是项目A依赖项目B,必需要把项目B进行打包安装放入本地仓库,而后再在项目A中引入才能使用。可是若是项目A依赖不少个其余项目,这样一一打包安装就比较麻烦了,这就引出了“聚合”。
<!-- 第一步:总项目必须声明为pom --> <packaging>pom</packaging> <!-- 第二步:总项目引入子项目地址,子项目 相对 总项目pom文件 的 相对地址 注意:这里是 子项目 而不是 子项目的pom文件相对总项目pom文件 ,这一点和依赖继承不一样 --> <modules> <module>../one</module> <module>../two</module> </modules> <!-- 而后子项目就能够正常互相引用,而省去了install的步骤 -->
有时候开发项目过程会遇到版本号统一升级的问题,例如junit版本从3.0版本升级成4.12版 这个时候有两个处理办法
在pom文件里统一 ctrl+f 搜索替换一下。
使用pom里的properties标签,自定义一个 xxx 标签,标签内就是版本号,在须要使用的地方使用 ${xxx} 灵活取出上面定义的值,这个样子就不用那样修改多个地方啦
<properties> <junit>4.12</junit> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit}</version> <scope>compile</scope> </dependency> </dependencies>