Maven概述
案例一 假如你正在使用idea开发两个Java项目,它们称为项目A、项目B,其中项目A中的一些功能依赖于项目B中的某些类,那么如何维系这种依赖关系的呢? 需要用哪个项目中的哪些类,也就是用别人写好了的功能代码,导入jar包即可。所以这里也如
引入Maven
案例一
问题:
假如你正在使用idea开发两个Java项目,它们称为项目A、项目B,其中项目A中的一些功能依赖于项目B中的某些类,那么如何维系这种依赖关系的呢?
解决办法
需要用哪个项目中的哪些类,也就是用别人写好了的功能代码,导入jar包即可。所以这里也如此,可以将B项目打成jar包,然后在A项目的Library下导入B的jar文件,这样,A项目就可以调用B项目中的某些类了。
缺陷
1.如果在开发过程中,发现B中的bug,则必须将B项目修改好,并重新将B打包并对A项目进行重编译操作
2.如果我们所依赖的jar包,功能修改了,我们要想使用修改过后的新功能,必须重新打包,添加到我们的项目中
案例二:
问题
一个公司有可能同时开发好几个项目,那么这几个项目,都是要用到相同的几十个jar包,怎么解决这个问题?
解决办法
其实这个问题很好解决,我们只需要把这些jar包给整理好,那个项目中要用到这些jar包,我们就把jar包复制到那个项目中即可!
缺陷
会导致每个项目体积很大,体积很大的一个原因就是因为jar包太多,而且还不好管理,如果我们不小心导入了重复的jar包,出现了jar包冲突的问题,那这个问题就不太好解决了
Maven概念
Maven 翻译为"专家"、"内行",是 Apache 下的一个纯 Java 开发的开源项目。Maven 是一个项目管理工具,它包含了一个项目对象模型,一组标准集合,一个项目生命周期,一个依赖管理系统,和用来运行定义在生命周期阶段中插件目标的工具。
Maven能解决的问题
可以用更通俗的方式来说明。我们知道,项目开发不仅仅是写写代码而已,期间会伴随着各种必不可少的事情要做,下面列举几个感受一下:
1. 我们需要引用各种jar包,尤其是比较大的工程,引用的jar包往往有几十个乃至上百个,每用到一种jar包,都需要手动引入工程目录,而且经常遇到各种让人抓狂的jar包冲突,版本冲突。
2. 我们写好的java文件,需要通过javac编译成class文件才能交给JVM运行。这项工作可以由各种集成开发工具帮我们完成 Eclipse、IDEA 等都可以将代码即时编译。
3. 世界上没有不存在 bug 的代码,因此写完了代码,我们还要写一些单元测试,然后一个个的运行来检验代码质量。
4. 再优雅的代码也是要出来卖的。我们后面还需要把代码与各种配置文件、资源整合到一起,进行打包。如果是 web 项目,还需要将之发布到服务器 。
试想,如果现在有一种工具,可以把你从上面的繁琐工作中解放出来,能帮你构建工程,管理 jar包,编译代码,还能帮你自动运行单元测试,打包,生成报表,甚至能帮你部署项目,生成 Web 站点,你会心动吗? **Maven** 就可以解决上面所提到的这些问题。
Maven的核心功能
依赖管理
* 传统的 WEB 工程中,我们必须将工程所依赖的 jar 包复制到工程中,导致了工程的变得很大。
* maven的 WEB 工程中不直接将jar包导入到工程中,而是通过在 pom.xml 文件中添加所需jar包的坐标。项目运行时,通过读取坐标到一个专门用于“存放jar包仓库"(Maven仓库)找到相应的jar包。
一键构建
* 我们开发的项目,往往都要经历编译、测试、打包、安装,部署等一系列过程。
* 什么是构建项目
指的是项目从编译、测试、打包、安装,部署整个过程都交给maven进行管理,这个过程称为构建。
* 一键构建
指的是整个构建过程,使用 maven 一个命令可以轻松完成整个工作。
Maven的安装与使用
下载和安装
- 下载
官方网站:http://maven.apache.org/
下载页面:http://maven.apache.org/download.cgi
下载地址:http://archive.apache.org/dist/maven/maven-3/
- 安装
Maven使用java语言开发的,解压即可运行
注意:maven依赖 JAVA_HOME
Maven的目录
* bin:存放了 maven 的命令,比如我们前面用到的 mvn tomcat7:run
* boot:存放了一些 maven 本身的引导程序,如类加载器等
* conf:存放了 maven 的一些配置文件,如 setting.xml 文件
* lib:存放了 maven 本身运行所需的一些 jar 包
配置环境变量
MAVEN_HOME: maven安装目录
path: %MAVEN_HOME%\bin
测试maven
mvn --version
Maven仓库的分类
Maven仓库其实就是存放jar包的地方,通常我们称之为仓库。Maven仓库主要分为:远程仓库和本地仓库两大类。
本地仓库
Maven会将工程中依赖的Jar包从远程下载到本机一个目录下管理.
每个电脑默认的仓库是在 ${user.home}/.m2/repository下,一般我们不使用默认的仓库,需要自己设置仓库目录。
注意:在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建
远程仓库
- 中央仓库
Maven内置了远程公用仓库:http://repo1.maven.org/maven2 这个公共仓库是由Maven自己维护,里面有大量的常用 类库,并包含了世界上大部分流行的开源项目构件。目前是以java为主工程依赖的jar包如果本地仓库没有,默认从中央仓库下载
- 中央仓库的特点
* 1.中央仓库是由maven官方社区提供给大家使用的
* 2.不需要我们手动去配置,maven内部集成好了
* 3.使用中央仓库时,机器必须是联网状态,需要可以访问中央仓库的地址
- 第三方仓库
中央仓库只有一个在国内访问中央仓库,使用非常慢,我们可以更换为:阿里云镜像
阿里云是将中央仓库的jar文件,进行克隆一份,存入在阿里云的服务器上,供我们国内的程序员使用。
私服仓库
私服也是远程仓库中的一种,我们为什么需要私服呢?
如果我们一个团队中有几百个人在开发一些项目,都是采用maven的方式来组织项目,那么我们每个人都需要从远程仓库中把需要依赖的构件下载到本地仓库,这对公司的网络要求也比较高,为了节省这个宽带和加快下载速度,我们在公司内部局域网内部可以架设一台服务器,这台服务器起到一个代理的作用,公司里面的所有开发者去访问这个服务器,这台服务器将需要的构建返回给我们,如果这台服务器中也没有我们需要的构建,那么这个代理服务器会去远程仓库中查找,然后将其先下载到代理服务器中,然后再返回给开发者本地的仓库。
注意:连接私服,需要单独配置。如果没有配置私服,默认不使用
- 私服的好处
1.加速maven的下载速度
2.节省宽带
3.方便部署自己的构件以供他人使用
4.提高maven的稳定性,中央仓库需要本机能够访问外网,而如果采用私服的方式,只需要本机可以访问内网私服就可以了
配置本地仓库
1. 将今天资料中的 repository.zip 解压到非中文及特殊符号目录下
2. 修改 maven的安装目录/conf/settings.xml 文件的标签
<localRepository>本地仓库地址</localRepository>
<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
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<localRepository>E:\apache-maven-3.5.4\repository</localRepository>
</settings>
配置阿里云镜像
修改 maven 根目录下的 conf 文件夹中的 setting.xml 文件,在 mirrors 节点上,添加内容如下:
<mirrors>
<!-- mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
-->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
IDEA集成maven
配置全局Maven


我们在IDEA创建maven工程默认从互联网在下载一个骨架(但是我们电脑没有联网,就会卡顿一段时间,再使用本地骨架),我们可以直接指定IDEA查找本地骨架,效率提升,并且指定编码为utf-8
-DarchetypeCatalog=internal -Dfile.encoding=UTF-8

Maven构建工程
Maven构建Java工程




java工程名(项目名)
|-- src目录
|-- main目录(主干代码)
|-- java目录(java代码)
|-- resources目录(配置文件)
|-- test目录(测试代码)
|-- java目录(java代码)
|-- resources目录(配置文件)
|-- pom.xml(maven工程核心配置文件)
|-- target目录(存放编译后的class文件.....)
Maven构建JavaWeb工程目





创建java&resources目录
web项目创建完后,会发现没有 java 和 resources 两个目录
需要我们手动创建,并标注两个目录


每次都创建web工程都需要 java, resources 目录,
在课程资料( maven-修改web项目结构及web.xml )中修改模版即可

web工程名(项目名)
|-- src目录
|-- main目录(主干代码)
|-- java目录(java代码)
|-- resources目录(配置文件)
|-- webapp目录(页面资源)
|-- WEB-INF
|-- web.xml(web工程核心配置文件)
|-- index.jsp
|-- css、js、img..
|-- test目录(测试代码)
|-- java目录(java代码)
|-- resources目录(配置文件)
|-- pom.xml(maven工程核心配置文件)
|-- target目录(存放编译后的class文件.....)
打包方式
普通java工程打包方式:
<packaging>java</packaging>
普通JavaWEB工程打包方式:
<packaging>war</packaging>
普通父工程打包方式:
<packaging>pom</packaging>
pom.xml 管理
Maven的坐标和依赖
想要用哪个jar包,通过坐标方式进行依赖引入...
添加依赖包
要导入jar,首先要得到其坐标,那么怎么得到坐标呢?
maven的搜索仓库: http://mvnrepository.com/

提示:
如果本地仓库没有相应版本的jar,会自动到中央仓库去找,然后自动下载,并缓存到本地。
下次再使用jar包,就直接在本地中查找了
依赖范围
| compile | 编译需要,打包需要 (大多数的jar都是这种)-默认值 |
|---|---|
| provided | 编译需要,不会被打包 (servlet、jsp) |
| runtime | 编译不需要,打包运行时需要(jdbc驱动) |
| test | 参与测试,不会打包 (junit) |
<!--servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--jsp的依赖包-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<!--mysql驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.16</version>
<scope>runtime</scope>
</dependency>
<!--junit依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
统一版本管理
<properties>
<!--统一的管理版本-->
<junit-version>4.12</junit-version>
<servlet-version>3.1.0</servlet-version>
</properties>
<!--添加依赖-->
<dependencies>
<!--junit依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit-version}</version>
<scope>test</scope>
</dependency>
<!--servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet-version}</version>
<!--编译时需要,打包时不需要-->
<scope>provided</scope>
</dependency>
</dependencies>
项目启动
添加tomcat
- 添加tomcat插件
- 最新的maven,最高支持tomcat7 没有tomcat8
<!--添加tomcat插件-->
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<!--<path>/</path>-->
</configuration>
</plugin>
</plugins>
</build>



优化启动


添加tomcat动态模版

发布项目名问题
- 发布项目名 和 artifactId 名 以哪个以主? artifactId名才是真正的项目名

多模块和继承
多模块解决:
将maven项目分解,为了统一管理和开发方便;
继承解决 :
使用pom配置,为了复用和整合的问题;
提示:
两者虽然概念不同,但在企业中会一起使用。
多模块:
将一个大工程分成几个小的工程便于开发。
继承:
多个模块之间有关系,主要是指子模块和父工程之间的继承关系。
构建父子工程
目标:构建一个父工程,两个子工程,让父工程管理子工程。
建立父工程



- 把父程的src删除,只需要pom.xml文件即可
提示:父工程的作用:就是用来操作子工程的,用来被继承的。
建立两个子模块项目,引用父工程


- 创建两个子工程,查看父子关系

测试继承父子工程关系

父工程统一管理依赖
统一操作:只对父工程进行构建操作,就会同时操作管理各个子模块
对父工程进行编译、清理、打包或安装操作
<?xml version="1.0" encoding="UTF-8"?>
<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>cn.yanqi.parent</groupId>
<artifactId>maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!--父工程打包方式-->
<packaging>pom</packaging>
<!--父工程下管理的子工程-->
<modules>
<module>son1</module>
<module>son2</module>
</modules>
<!--父工程下不是所有的子工程都需要继承父工程中的依赖包,通过统一管理版本子工程按需加载-->
<!--统一管理版本-->
<properties>
<junit-version>4.11</junit-version>
<mysql-version>5.1.32</mysql-version>
</properties>
<!--父工程管理依赖-->
<dependencyManagement>
<dependencies>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit-version}</version>
<scope>test</scope>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
- son1子工程 son2子工程 按需要加载即可

聚合工程-项目分解
项目的分解:可以从两个角度来,一个是业务角度(业务模块,不同的业务模块),一个是代码开发角度(分层,一个人认领一个层,每个层独立开发,最终整合到一起)
多模块:将SSm案例按照业务模块或者服务器分层拆分为多个module
继承:使用继承,将公共配置放入到父pom中
多模块和继承一块使用
建立父工程 (公共配置,统一管理)


按三层划分
web项目 + service项目+ dao项目 + domain项目(注意依赖的顺序)
- 创建父工程

- domain项目为jar工程

- web项目为war工程

- Service项目为jar工程

- Dao项目为jar工程

- 查看父工程结构

- 查看子工程

工程之间的依赖关系
web依赖service , service依赖dao, dao依赖domain
每个工程需要单独引入依赖关系,如dao依赖domain的引入



查看项目依赖关系
