Maven
Maven能解决的问题
-
管理和构建项目
-
解决jar冲突的问题
-
解决依赖问题
Maven介绍及环境搭建
-
Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具
-
解压并配置环境变量
-
目录说明
-
bin:包含mvn的运行脚本
-
boot:包含一个类加载器的框架,maven使用它加载自己的类库
-
conf:配置文件目录,settings.xml
-
lib:maven运行时用到的类库和第三方依赖类库
-
-
mvn -v 可以查看到maven的版本号,java版本,系统版本
-
maven项目的目录结构
-
src-->main-->java-->package
-
src--test-->java-->package
-
src--resources
-
-
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>test</groupId>
<artifactId>test01</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>test01</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
常用构建命令
-
编译项目:mvn compile
-
运行测试用例:mvn test
-
打包项目:mvn package
-
删除target文件夹(字节码文件和测试报告):mvn clean
-
将jar包安装到本地仓库:mvn install
自动创建目录骨架
-
archetype插件用于创建符合maven规定的目录骨架
-
创建目录骨架:mvn archety:generate
-
另一种方式:mvn archety:generate -DgroupId=com.lorinda.demo -DartifactId= mavenDemo -Dversion=1.0.0SNAPSHOT -Dpackage:com.lorinda.cc
-
groupId一般为组织名,公司网址的反写+项目名
-
artifactId一般为项目名-模块名
-
version为版本号
-
代码所在包名
-
maven中的坐标和仓库
- 坐标:任何一个依赖,插件项目构件的输出,所有构件通过坐标作为其唯一标识
标识:
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
仓库:用来管理依赖,如果在本地找不到依赖则到maven的全球的中央仓库找,并下载到本地
在maven的settings.xml 文件里配置mirrors的子节点,添加如下mirror:
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
-
http://maven.aliyun.com/nexus/#view-repositories;public~browsestorage
-
更改仓库默认位置
在settings.xml中加入:
<localRepository>地址</localRepository>
在eclipse中安装maven插件以及创建maven项目
-
eclipse插件地址:http://download.eclipse.org/technology/m2e/releases
-
按照默认方式创建项目后,在pom.xml文件上右键,选择run as,Maven Build,在Goals中输入compile
maven的生命周期和插件
-
完整的项目构建过程包括:清理,编译,测试,打包,集成测试,验证,部署
-
maven生命周期(相互独立的,后面的依赖前面的)
-
clean 清理项目
-
pre-clean 执行清理钱的工作
-
clean 清理上一次构建生成的所有文件
-
post-clean 执行清理后的工作
-
-
default 构建项目(最核心)
-
compile
-
test
-
package
-
install
-
-
site 生成项目站点
-
pre-site 在生成项目站点前要完成的工作
-
site 生成项目站点的文档
-
post-site 在生成项目站点后要完成的工作
-
site-deploy 发布生成的站点到服务器上
-
-
-
在package是打包源码,用的source插件
在pom.xml中
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
pom.xml常用元素介绍
-
modelVersion指定当前pom版本
-
groupId,artifactId,version,packaging共同组成坐标标识,packaging默认是jar,它还可以打包成war,zip,pom等
-
name:项目描述
-
url:项目的地址
-
description:项目的描述
-
developers:开发人员
-
licenses:许可信息
-
organization:组织信息
-
dependencies:依赖
<dependencies>
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<type></type>
<scope>依赖的范围</scope>
<optional>设置依赖是否可选true和false(默认)</optional>
<exclusions>依赖排除
<exclusion></exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>依赖列表,不会被运行,定义在父模块中被子模块继承
<dependencies>
<dependency>
</dependency>
</dependencies>
</dependencyManagement>
<build>为构建提供支持
<plugins>插件列表
<plugin>
坐标
</plugin>
</plugins>
</build>
<parent></parent>
<modules></modules>编译多个模块
依赖范围(scope)
-
六种classpath
-
compile(默认)
-
provided 在编译和测试时有效
-
runtime 在测试和运行时有效
-
test 只在测试时有效
-
system 在编译和测试时有效,可移植性差
-
import 导入的范围,它只使用在dependencyManagement中,表示从其他的pom中导入dependency的配置
-
依赖传递
-
使用dependency和坐标指定依赖即可,使用前需要将依赖install
-
可以exclusions排除依赖
-
可以自settings.xml中指定jdk版本
依赖冲突
-
如果有A和B依赖不同版本的相同的构件,对于依赖A和B的C来说,它到底依赖A和B哪个版本的构件?两个原则
-
短路优先
-
先声明的优先(xml中的先后顺序)
-
聚合和继承
- 新建maven项目(同级),在pom.xml中:packaging更改为pom,添加:
<modules>
<module>../项目名</module>
<module>../项目名</module>
<module>../项目名</module>
</modules>
install就可以一起构建了
- 新建项目,packaging改为pom,在dependencyManagement中加入
<dependencyManagement>
<dependencies>
<dependency>
坐标
</dependency>
</dependencies>
</dependencyManagement>
在其他项目中使用patent标签加父类的坐标就可以继承父类了