Maven是项目管理和构建工具。那具体怎么进行项目管理和构建的呢?
应用场景,在电商项目中,分为订单、商品、商家、用户、营销模块,其中订单模块需要用到用户模块的代码,比如查询用户信息的接口,那是不是需要用户模块的同学把代码拷贝一份给订单模块呢?若是这么做,会出现很多问题,第一用户模块的代码有bug、功能一直在迭代,比如查询用户信息按userId查询,增加按姓名查询,每次更新代码都需要重新拷贝代码,效率很低。所以把这些代码集中存储管理,用包+版本的方式,集中存储的地方叫仓库,变更通过版本号为维护,包的版本分为测试版本和线上版本,Snapshot和Release。
仓库
在maven中,仓库Repository是非常重要的一个概念。
maven仓库分为本地仓库和远程仓库,远程仓库又包括中央仓库和私服,其中私服就是在局域网内搭建的一个私有的仓库地址。
很多人会把私服和镜像(mirror)弄混,镜像(mirror)是中央仓库的复制品,原因也很简单,中央仓库在国外,你访问中央仓库的速度慢,镜像的服务器在国内,相当于弄了个缓存。
Idea中maven默认的配置如下
一般放在用户目录下的.m2目录下。
settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<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>/.../.m2/repository</localRepository>
<interactiveMode>true</interactiveMode>
<!--服务端的一些设置。如用户名密码不应该和项目的pom.xml放在一起,密码等认证信息应该存在于settings.xml文件中。 -->
<servers>
<server>
<!--这是server的id(注意不是用户登陆的id),该id与distributionManagement中repository元素的id相匹配。 -->
<id>server001</id>
<!--鉴权用户名-->
<username>my_login</username>
<!--鉴权密码-->
<password>my_password</password>
<!--鉴权时使用的私钥位置 -->
<privateKey>/.../.ssh/id_dsa</privateKey>
<!--鉴权时使用的私钥密码。 -->
<passphrase>some_passphrase</passphrase>
</server>
</servers>
<mirrors>
<mirror>
<!-- 镜像的唯一标识符-->
<id>aliyunmaven</id>
<!-- 被镜像的服务器的id。-->
<mirrorOf>central</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
<profiles>
<profile>
<!-- profile的唯一标识 -->
<id>aliyun</id>
<!-- 让当前profile 生效的条件(激活当前profile) -->
<activation>
<!-- 默认激活状态为false -->
<activeByDefault>false</activeByDefault>
<!-- jdk为1.8时激活 -->
<jdk>1.8</jdk>
</activation>
<!-- 远程仓库列表 -->
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<layout>default</layout>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>aliyun</activeProfile>
</activeProfiles>
</settings>
localRepository :我们从远程仓库拉取的maven 包在本地存放的仓库地址;
servers :有些仓库的访问需要用户名密码做身份认证,比如公司自己的仓库。一般 repositories 和 distributionManagement 都会在项目里面的pom.xml 定义,但是用户名密码不适合直接明文放在项目的pom中,而且有的密码是每个人私有的,所以更适合在maven settings.xml里面配置;
mirrors:mirror这个单词是镜像的意思,这里是配置远程仓库的镜像,前面安琪拉提到过,中央仓库可能访问量比较大,访问比较慢,所以可以用镜像来缓存远程仓库的压力。
POM
POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖。
所有 POM 文件都需要 project 元素和三个必需字段:groupId,artifactId,version。
构建生命周期
清理clean:将编译得到的旧文件class字节码文件删除;
编译compile:将java源程序编译成class字节码文件,编译resource资源文件;
测试test:自动运行测试用例
报告report:测试程序执行的结果
打包package:动态Web工程打War包,java工程打jar包
安装install:将打包得到的文件复制到“仓库”中的指定位置,比如我们多模块构建的时候使用install 将包安装到本地仓库;
部署deploy:将包部署到指定仓库,或者配置应用部署的运行目录;
这些Lifecycle实际都是通过插件的形式来完成的,其实功能都是通过插件来完成的。
一般稍大一点的项目,都是采用多模块管理,如果引入了领域概念,一般分层还有领域层。
scope
一个属性是scope,我们看下scope 的可选值:compile、runtime、test、provided。
compile :默认值,compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。
provided :在编译、测试时有效,但是在运行时无效。例如:servlet-api,运行项目时,Tomcat这种运行容器已经提供,就不需要Maven重复地引入一遍了。
runtime :在运行、测试时有效,但是在编译代码时无效。例如:JDBC驱动实现,项目代码编译只需要JDK提供的JDBC接口,只有在测试或运行项目时才需要实现上述接口的具体JDBC驱动。
test :只在测试时有效,例如:JUnit。