项目管理工具Maven

一、Maven的概念

1 什么是Maven

跨平台项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。

什么是理想的项目构建?

高度自动化,跨平台,可重用的组件,标准化的流程。

2 什么是依赖管理

对第三方依赖包的管理,可以连接互联网下载项目所需第三方jar包。

对自己开发的模块的管理,可以像引用第三方依赖包一样引用自己项目的依赖包。

3 什么是项目构建

项目构建:是一个从编写源代码到编译、测试、运行、打包、部署的过程。

传统项目:

打开Idea编写源代码和配置文件,对源代码进行编译,可以使用Junit进行单元测试,把项目打成war包,部署到Tomcat服务器中运行。

maven项目:

maven将项目构建过程进行标准化,每个阶段都可以使用一个命令来完成。

清理 --> 编译 --> 测试 --> 报告 --> 打包 --> 部署

4 Maven的优点

拥有约定,知道你的代码在哪里,放到哪里去。

拥有一个生命周期,例如执行 mvn install 就可以自动执行编译,测试,打包等构建过程。

只需要定义一个pom.xml,然后把源码放到默认的目录,Maven帮你处理其他事情。

拥有依赖管理,仓库管理。

二、初始Maven

1 Maven安装目录分析

bin:含有mvn运行的脚本

boot:含有plexus-classworlds类加载器框架

conf:含有settings.xml配置文件

lib:含有Maven运行时所需要的java类库

LICENSE.txt, NOTICE.txt, README.txt针对Maven版本,第三方软件等简要介绍

2 Maven仓库

仓库是用来统一存储所有Maven共享构建的位置,可根据Maven坐标定义每个构建在仓库中唯一存储路径。

groupId/artifactId/version/artifactId-version.packaging

仓库的分类:

本地仓库:每个用户只有一个本地仓库

远程仓库:(1)中央仓库:Maven默认的远程仓库 http://repol.maven.org/maven2

(2)私服:一种特殊的远程仓库,它是架设在局域网内的仓库

三、Maven的进阶

1 pom.xml文件

Maven项目的核心是pom.xml文件。Pom定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等等。

2 坐标

2.1 概念

在Maven中坐标是构件的唯一标识,Maven坐标的元素包括groupId、artifactId、version(必须定义)、packaging(可选定义)、classifier。

2.2 含义

groupId:组织标识,一般为:公司网址的反写+项目名

artifactId:项目名称,一般为:项目名-模块名

version:版本号 形式为0.0.1-SNAPSHOT:

第一个 0 表示大版本号,第二个 0 表示分支版本号,第三个 0 表示小版本号

SNAPSHOT -- 快照版本,ALPHA -- 内侧版本,BETA -- 公测版本,RELEASE -- 稳定版本,GA -- 正式发布

packaging:打包的方式,如:pom, jar, maven-plugin, ejb, war, ...

clissifier:用来帮助定义构件输出的一些附属构件。

3 依赖

3.1 依赖的使用

属性说明:

  • 三维坐标:引用依赖包的三维坐标,用来定位该依赖包;
  • scope: 控制该依赖包在什么情况下会被加到 classpath 中;

3.2 依赖的范围

(1)3中classpath:

  • 主代码:main下面的都是主代码在编译时的依赖
  • 测试代码:test下是测试代码编译的时候的依赖
  • 运行时:main代码在运行的时候对包的依赖

依赖范围的使用,通过引用第三方依赖时的<scope></scope>标签进行设置,例如:

共6种scope,包括::compileprovidedruntimetest、system、import。

3.3 依赖传递和可选依赖

(1)依赖传递

第一直接依赖:HelloFriend项目依赖Hello项目

第二直接依赖:MakeFriend项目依赖HelloFriend项目

(2)依赖范围对依赖传递的影响

  • 完全传递:compile、runtime
  • 不传递:provided、test、system、import

(3)依赖阻断

表示当HelloFriend被其他项目依赖时,不传递Hello的依赖至依赖于HelloFriend的项目

(4)可选依赖

exclusion属性

3.4 仓库

(1)概念:项目中依赖的第三方库的位置

(2)类型:本地、中央、远程

(3)构件:任何一个依赖、插件或者项目构建的输出

(4)依赖搜索顺序:本地库----->中央仓库(有则下载到本地仓库)--->远程仓库(没有则报错)

3.5 Maven的继承和聚合

Maven聚合需要5个子模块:前台 后台 公共模块 图片服务器 外层的父工程(不需要写代码)

打jar包可以默认不勾选模板

四、Maven私服架构

私服:公司内部的Maven远程仓库,员工将自己开发的项目打成jar包并发布到私服服务器,其他项目组从私服服务器下载所依赖的构件(jar包);私服还充当代理服务器

Nexus:Maven仓库管理器

1 Maven私服实战

(1)安装nexus

(2)将项目发布到私服:修改settings.xml文件【私服校验】----->

<!-- 定义稳定版本的id名称,用户名密码 -->

<server>

<id>releases</id>

<username>admin</username>

<password>admin123</password>

</server>

<!-- 定义开发版本的id名称,用户名密码 -->

<server>

<id>snapshots</id>

<username>admin</username>

<password>admin123</password>

</server>

------------->配置项目pom.xml【配置私服仓库地址,公司自己的jar包会上传到私服宿主仓库】

< distributionManagement**>**
< repository**>**
< id**>** releases**</** id**>**
< url**>** http://localhost:8079/nexus/content/repositories/releases/**\</** url**>**
</ repository**>**
< snapshotRepository**>**
< id**>** snapshots**</** id**>**
< url**>** http://localhost:8079/nexus/content/repositories/snapshots/**\</** url**>**
</ snapshotRepository**>**
</ distributionManagement**>**

------------------>执行deploy命令------------>查看私服结果

(3)从私服下载jar包:修改setting.xml文件

<mirror>

<!-- id名称 -->

<id>nexusmaven</id>

<!-- 表示拦截所有的请求,都重定向到私服,从私服下载jar包,私服没有再去中央仓库下载 -->

<mirrorOf>*</mirrorOf>

<name>nexus maven</name>

<!-- 私服的组地址 -->

<url>http://localhost:8079/nexus/content/groups/public/\</url>

</mirror>
<!-- 下载jar包配置 -->

<profile>

<!--profile的id -->

<id>dev</id>

<repositories>

<repository> <!--仓库id,repositories可以配置多个仓库,保证id不重复 -->

<id>nexus</id> <!--仓库地址,即nexus仓库组的地址 -->

<url>http://localhost:8079/nexus/content/groups/public/\</url> <!--是否下载releases构件 -->

<releases>

<enabled>true</enabled>

</releases> <!--是否下载snapshots构件 -->

<snapshots>

<enabled>true</enabled>

</snapshots>

</repository>

</repositories>

<pluginRepositories> <!-- 插件仓库,maven的运行依赖插件,也需要从私服下载插件 -->

<pluginRepository> <!-- 插件仓库的id不允许重复,如果重复后边配置会覆盖前边 -->

<id>public</id>

<name>Public Repositories</name>

<url>http://localhost:8079/nexus/content/groups/public/\</url>

</pluginRepository>

</pluginRepositories>

</profile>

------------->激活配置

<activeProfiles>

<activeProfile>dev</activeProfile>

</activeProfiles>

(4)第三方jar包发布到私服

jar包安装到本地仓库---------->setting.xml配置文件

<server>

<id>thirdparty</id>

<username>admin</username>

<password>admin123</password>

</server>

----------->上传到私服

mvn deploy:deploy-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dpackaging=jar -Dfile=fastjson-1.1.37.jar -Durl=http://localhost:8079/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty