Maven基本使用
1、Maven是什么
Maven项目对象模型(Project Object Model,简称POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。
Maven除了以程序构建能力为特色之外,还提供高级项目管理工具。由于Maven的缺省构建规则有较高的可重用性,所以常常用两三行Maven构建脚本就可以构建简单的项目。由于Maven的面向项目的方法,许多Apache Jakarta项目发文时使用Maven,而且公司项目采用Maven的比例在持续增长。
Maven这个单词来自于意第绪语(犹太语),意为知识的积累,最初在Jakata Turbine项目中用来简化构建过程。当时有一些项目(有各自Ant build文件),仅有细微的差别,而JAR文件都由CVS来维护。于是希望有一种标准化的方式构建项目,一个清晰的方式定义项目的组成,一个容易的方式发布项目的信息,以及一种简单的方式在多个项目中共享JARs。
小结:Maven是基于项目对象模型(POM),可以通过一小段的描述信息来管理项目的构建、报告和文档的软件项目管理工具。
2、Maven的下载及配置
直接去Maven官网:
点击Download:
选择合适的版本下载即可。注意的一点是Maven版本和JDK版本的兼容关系。
下载完zip包后直接解压:
包含4个目录。
然后修改conf目录下的settings.xml配置文件:
可以修改本地仓库的路径,指定为磁盘上的任意位置都可以。依赖是从远程仓库下载到本地仓库中的,远程仓库时Maven的总仓库,在国外。
它默认的远程仓库地址是国外,外网访问非常慢,下载更是跟龟速一样,所以一般会配置成国内的镜像仓库,比如阿里云的仓库,这样速度就很快了。
可以配置一下JDK的版本,这样每次生成Maven项目,那么它自动引入的是JDK1.8版本的依赖。
配置环境变量
和JDK一样,Maven也需要配置环境变量:
配置完毕后测试是否成功:
输入命令mvn -v
,出现以上界面是配置成功了,否则检查配置。
3、Maven的目录结构
src
-main
-java
-package
-package
......
-test
-java
-package
-package
......
-resources
-*.xml
-*.js
-*.jsp
-*.css
......
说明:src/main/java
下是主要代码,src/test/java
里面可以放测试代码,resources
下放动态web的主要资源文件,比如jsp、html、css、js、图片等。
4、测试
建立一个空文件夹m1:
m1里面:
创建一个pom.xml,一个src目录。
pom.xml内容:
<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>com.ycz.m1</groupId>
<artifactId>m1-model</artifactId>
<version>0.0.1SNAPSHOT</version>
<!--依赖坐标-->
<dependencies>
<!--junit测试依赖坐标-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
</project>
src目录下创建两个目录:main和test。
main目录:
java子目录:
子目录下有3层目录,最里面的demo目录下有一个java源文件:
test目录:
java子目录:
子目录下同样有3层目录,最里面的demo目录下有一个java源文件:
下面将m1项目进行打包:
在该级目录下运行命令:mvn compile
。
编译成功。
生成了一个target目录:
然后继续命令:mvc test
。
测试成功。target目录:
生成了3个新的目录。
然后继续命令:mvn package
。
target目录:
成功的生成了一个jar包,这个jar包可以使用命名java -jar
来运行。
然后继续命令:mvn clean
。
target目录直接清除了。
继续命令:mvn install
。
生成target目录:
中央仓库:
成功将打包成功的jar包安装到了本地仓库中。以上就是项目进行编译、测试、打包、清除、安装的过程。
结论:mvn intall = mvn compile + mvn test + mvn package
。
5、Maven常用命令
以下几个命令是Maven种最常用的:
mvn -v
:查看maven版本。mvn compile
:编译。mvn test
:测试。mvn package
:打包。mvn clean
:删除target。mvn install
:安装jar包到本地仓库中。
这些命令在上面都已经用过了。
6、Maven自动建立目录骨架
可以使用archetype插件创建符合maven规定的目录骨架。
maven的规定:
- 在src/main/java中存放主代码。
- 在src/test/java中存放测试代码。
第一种方式创建:
直接命令:mvn archetype:generate
。
1到7之间选一个,这里选择7:
按照提示填写groupId、artifactId、version、package,然后确认:
构建成功。查看:
没问题。
第二种方式创建:
直接指定所有的参数一步搞定:
mvn archetype:generate -DarchetypeCatalog=internal -DgroupId=com.ycz.t2 -DartifactId=t2-demo -Dversion=1.0.0SNAPSHOT -Dpackage=com.ycz.t2.demo
需要指定5个参数,如下:
- -DarchetypeCatalog
- -DgroupId
- -DartifactId
- -Dversion
- -Dpackage
选择一项然后点确定:
构建成功。查看:
没问题。
7、maven中的坐标和仓库
7.1、坐标
坐标作为依赖在中央仓库的唯一标识,groupId、artifactId、version三个属性构成坐标。
示例:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
</dependency>
坐标正确才能够从远程的中央仓库下载依赖到本地仓库中。
7.2、仓库
仓库有本地仓库和远程仓库。默认是从远程仓库下载构件存放到本地仓库中,默认的远程仓库地址为https://repo.maven.apache.org/maven2。可以更改仓库的镜像,因为外网一般较慢,可改成国内镜像。在conf里面的setting.xml里的mirrors可以修改。本地仓库的位置也可以修改,默认的位置是${user.home}/.m2/repository,可以通过localRepository修改本地仓库的位置。
示例:
8、eclipse中集成maven
eclipse4.0版本以上无需安装,已经集成maven到了eclipse开发环境中,只是针对4.0版本以下。
查看window-Prefrences:
里面有个Maven选项,这里需要配置一下。
里面的User-Settings需要配置:
需要指定Maven的配置文件路径,下面的Local Repository会从配置文件中自动获取到Maven本地仓库的位置。
配置完成以后生成一个Maven项目:
勾选,然后Next:
填写groupId、artifactId,选择Version版本,选择打包的方式是jar还是war包。下面的父项目坐标可以暂时不写,点击完成:
创建了一个简单的Maven项目,可以看到项目左上角有个M标记,表示这是个Maven项目。pom.xml如下:
9、maven的生命周期和插件
一个完整的项目构建过程包括如下:清理、编译、测试、打包、集成测试、验证、部署。
Maven的生命周期
主要包括清理、构建项目、生成项目站点。
(1)clean
用于清理项目,该阶段又可分为以下三个阶段:
- pre-clean:执行清理前的工作。
- clean:清理上一次构建生成的所有文件。
- post-clean:执行清理后的文件。
(2)default
用于构建项目。该阶段又可分为以下四个阶段:
- compile:编译项目。
- test:测试。
- package:打包。
- install:集成,安装jar包到本地仓库。
(3)site
用来生成项目站点。可分为以下4个阶段:
- pre-site:在生成项目站点前要完成的工作。
- site:生成项目的站点文档。
- post-site:在生成项目站点后要完成的工作。
- site-deploy:发布生成的站点到服务器上。
Maven中的插件
pom.xml中一般会配置插件:
<!-- 使用插件 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork </goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
这个插件一般用来打包安装。
10、pom.xml详解
一个pom.xml示例:
<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">
<modelVersion>4.0.0</modelVersion>
<!-- 本项目的地址及版本 -->
<groupId>com.ycz.m1</groupId>
<artifactId>m1-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 本项目的打包方式 -->
<packaging>jar</packaging>
<!-- 项目描述名 -->
<name></name>
<!-- 项目地址 -->
<url></url>
<!-- 项目描述 -->
<description></description>
<!-- 本项目的父项目 -->
<parent>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<!-- 父项目的相对路径 -->
<relativePath></relativePath>
</parent>
<!-- 配置一些属性 -->
<properties></properties>
<!-- 本项目的子模块,可配置多个 -->
<modules>
<module></module>
</modules>
<!-- 依赖 -->
<dependencies>
<dependency>
<!-- 依赖坐标 -->
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<!-- 依赖存在的范围 -->
<scope></scope>
</dependency>
</dependencies>
<!-- 用于定义父类模块 -->
<dependencyManagement>
<!-- 依赖 -->
<dependencies>
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<scope></scope>
<!-- 排除的依赖 -->
<exclusions>
<exclusion>
<groupId></groupId>
<artifactId></artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<!-- 配置插件 -->
<plugins>
<!-- 子插件 -->
<plugin>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<executions>
<execution>
<phase></phase>
<goals>
<goal></goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
常用标签元素说明:
<project>
:是根元素,包含了一些约束信息。<modelVersion>
:指定了当前pom的版本。<groupId>
:反写的公司网址+项目名。<artifactId>
:项目名+模块名。<version>
:当前项目的版本号,一般由三个数字组成,第一个0表示大版本号,第二个0表示分支版本号,第三个0表示小版本号。- :快照。
<alpha>
:内部测试。<beta>
:公测。<Release>
:稳定。<GA>
:正式发布。<packaging>
:表示打包方式,不指定的话默认是打包成jar包。<name>
:项目描述名。<url>
:项目地址。<description>
:项目描述。<developers>
:开发人员列表。<licenses>
:许可证信息。<organization>
:组织信息。<dependencies>
:依赖列表,下面可包含多个依赖项。<dependency>
:依赖项,依赖项下面又有groupId、artifactId、version、scope、type、optional标签。<scope>
:依赖存在的范围,编译、测试、运行中的一种。<optional>
:设置依赖是否可选,默认为false,为继承的。<executions>
:排除依赖传递列表,下面可包含多个子列表。<dependencyManagement>
:用于定义父类模块,被子类模块继承。<build>
:对构建行为提供支持,如plugins插件列。<plugins>
:插件,下面可包含多个plugin插件。<plugin>
:子插件。<parent>
:用于子模块中对父模块pom的继承。<modules>
:聚合多个子模块。<module>
:子模块。
11、Maven依赖解析
依赖范围
<scope>
标签来规定,用来控制依赖与3种classpath的关系。
一般的classpath可设为以下3个值:compile(编译)、test(测试)、run(
运行)。
如junit的依赖范围scope的值为test,表明junit只能用于测试中。
scope的值有6种:compile、provided、runtime、test、system、import。
依赖的传递
比如B依赖于A,而C依赖于B,那么C会继承B的依赖和A的依赖,这就是依赖的传递性。
以下进行示例。
A模块:
A模块中只有mysql驱动包相关的依赖。
然后B模块:
B模块依赖于A模块,同时有一个commons-io的依赖包。
没问题。
然后C模块:
C模块只依赖于B模块,查看Maven依赖包:
没问题,A模块和B模块的依赖都传递到了C模块中。
依赖冲突
原则如下:
- 短路优先:比如A-B-C-X(jar),A依赖于B,B依赖于C,C依赖于X,X是jar。然后还有A-D-X(jar),A依赖于D,D依赖于X。那么Maven会判定为A依赖于D,因为路径短。
- 先声明先优先:如果路径长度相同,则谁先声明,先解析谁。
事实上,项目的依赖冲突和依赖版本之间不兼容是最麻烦的,很难排查出来。不过IDEA提供了快捷排查依赖冲突的方式,而eclipse却不具备,eclipse中排查依赖很困难。
12、Maven项目的聚合和继承
12.1、聚合
将pom.xml中的package值设为pom,然后使用<modules>
标签将任意个项目进行聚合。聚合的目的是为了方便快速构建项目。对于聚合模块来说,他知道有哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在。
示例:
A模块聚合了B模块和C模块,可以看到B、C模块都是一个单独的Maven项目子模块,都有自己的pom文件。
A的pom.xml如下:
主要是配置modules标签,A有2个子模块B和C。
12.2、继承
将pom.xml中的package值设为pom,需要用到<parent>
标签。父项目并不知道自己的子项目,但是子项目是知道父项目是哪个,继承的目的主要是为了消除依赖的重复配置。
示例:
主要是parents标签里面指定父项目。
实际上,开发中经常一个项目是父项目,同时它又是聚合项目。比如上面的A项目,它既是聚合模块,也是B和C的父项目。
13、Maven构建动态web项目
先创建一个普通的Maven项目:
点击Finish:
然后选中项目:
右键–Properties:
选择左边的Project Facets,然后点击右边的Convert to faceted form:
勾选左边标记的dyn选项,然后点击下面标记的地方:
内容目录可以任意命名,一般命名为webapp。下面自动生成web.xml需要勾选上,然后点击OK。
maven项目生成了一个webapp目录,下面是web项目的目录结构,那么此时maven项目也是一个web项目了,可以开始进行web项目的开发了。最常见的是SSM + Maven进行开发,非常快速。