Maven介绍
Maven 是一个项目管理和构建自动化工具. Maven使用惯例优与配置的原则.
它要求在没有定制之前,所有的项目都有如下的结构:
目的 | 功能 |
---|---|
${basedir} | 存放 pom.xml和所有的子目录(工程根目录) |
${basedir}/src/main/java | 项目的 java源代码 |
${basedir}/src/main/resources | 项目的资源文件,比如说 property文件 |
${basedir}/src/test/java | 项目的测试类,比如说 JUnit代码 |
${basedir}/src/test/resources | 测试使用的资源 |
说明: 编译后的classes会放在 ${basedir}/target/classes下面
Maven配置
Maven 依赖包下载
Maven官网下载Maven包: https://maven.apache.org/download.cgi
1 | [root@localhost /local ]$ wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.5.0/binaries/apache-maven-3.5.0-bin.tar.gz |
Maven 配置环境变量
在/etc/profile
文件末尾追加环境变量,如下:
1 | # 设置Meven环境变量 |
使配置生效
1 | [root@localhost ~]$ source /etc/profile |
Maven工程应用
基于命令行工程应用
基于命令行的工程应用,必须确保已经配置了Maven环境变量.
命令行创建工程
使用maven命令行创建一个maven工程.示例如下
1 | [root@localhost /export ]$ mvn archetype:generate -B -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.1 -DgroupId=com.wuyu -DartifactId=wuyu-module -Dversion=1.0.0-SNAPSHOT -Dpackage=com.wuyu.module |
参数说明
- -B: 批量模式,使用该参数会跳过一个一个的交互输入
- -DgroupId: 项目组织唯一的标识符
- -DartifactId: 项目的唯一的标识符,对应项目的名称,即项目根目录的名称.
- -Dversion: 生成的项目版本号
- -Dpackage: 生成的工程包路径
命令行编译工程
修改编译使用的jdk版本, pom.xml文件中增加如下配置指定jdk编译的版本和生成的字节码版本:
maven.compiler.source
maven.compiler.source
1 | [root@localhost wuyu-module ]$ cat pom.xml |
编译生成的工程,查看编译后的结构:
1 | [root@localhost wuyu-module ]$ mvn package |
可以看到编译后的结构入上图,target
下有我们编译的字节码还有编译打包好的jar包wuyu-module-1.0.0-SNAPSHOT.jar
.
命令行执行工程
1 | [root@localhost wuyu-module ]$ java -cp target/wuyu-module-1.0.0-SNAPSHOT.jar com.wuyu.module.App |
基于IDE的工程应用
这里演示使用IntelliJ IDEA创建Maven项目.
Maven创建单模块工程
【File】-【New】-【Project】-【Maven】-【勾选 Create from archetype】:
点击【Next】, 配置工程坐标:
点击【Next】,配置Maven信息:
点击【Next】, 配置工程名称, 示例中配置为: wuyu-module
, 点击完成(选择新窗口打开刚才创建的示例工程).
Maven创建多模块工程
上面示例中我们创建了一个工程,改工程为单模块的. 实际开发中我们可能根据工程职责分成多个模块, 接下来展示如何构建多模块工程.
刚才的工程对于多模块中只有pom.xml文件有用,其它的src目录下的都没用,所以可以做如下操作:
- 删除src以及其子目录
- 修改pom.xml中packaging类型为pom.
- 选中工程,右键:【New】-【Module】,然后创建子模块的定义.
创建jar格式的子模块
普通的jar模块,选择的maven类型为maven-archetype-quickstart
创建war格式的子模块
创建完后的多模块工程结构如下:
Maven统一依赖管理
maven版本统一管理采用<dependencyManagement>
元素结点, 主要有两个作用,一个是集中管理项目的依赖项,另一个就是控制使用的依赖项的版本.
该节点主要应用于父pom, 里边托管所有要依赖的包依赖, 子包引入的时候, 采用dependencyManagement里边的包的子集的时候不需要指定版本.类似还有pluginManagement
.用于统一管理maven的插件版本.
父类模块中dependencyManagement排除功能,同样会应用到到子模块.
说明: 右侧我们看到的Lifecycle模块是IDEA中提供的方便我们进行Maven命令执行的可视化工具, 支持单选和多选.
Maven依赖包作用域
Maven在引入依赖包的时候可以指定作用域,使用scope
标签. scope的取值有compile
(默认)、runtime
、test
、 provided
、 system
和 import
compile
: 默认作用范围,compile范围内的依赖项在所有情况下都是有效的,包括运行、测试和编译时(会被打到包里)。runtime
: 表示该依赖项只有在运行时才是需要的,在编译的时候不需要。这种类型的依赖项将在运行和test的类路径下可以访问(会被打到包里)。test
: 表示该依赖项只对测试时有用,包括测试代码的编译和运行,对于正常的项目运行是没有影响的(不会打到包里)。provided
: 表示该依赖项将由JDK或者运行容器在运行时提供,也就是说由Maven提供的该依赖项我们只有在编译和测试时才会用到,而在运行时将由JDK或者运行容器提供(不会打到包里)。system
: 当scope为system时,表示该依赖项是我们自己提供的,不需要Maven到仓库里面去找。指定scope为system需要与另一个属性元素systemPath一起使用,它表示该依赖项在当前系统的位置,使用的是绝对路径(不会打到包里)。import
: (Maven2.0.9及以上)import范围只适用于pom文件中的部分。表明指定的POM必须使用 部分的依赖。因为依赖已经被替换,所以使用import范围的依赖并不影响依赖传递
Maven依赖冲突排除
我们可能经常会遇到这样一个问题:我们的项目有两个依赖项:A & B,而且A和B同时依赖了C,但不是同一个版本。那么我们怎么办呢?
添加检查插件
1 | <reporting> |
然后运行:mvn project-info-reports:dependencies,来查看依赖项报告.
去除依赖项
1 | <dependency> |