maven基础

项目管理工具 maven

1 学习目标

第一天:

1、会使用 maven 构建项目的命令

2、会使用 maven 构建 java 项目和 java web 项目

3、构建 maven-web  工程整合 struts2 成功

第二天:

1、依赖管理--传递依赖 版本冲突处理

2、 web 的单个工程中实现 SSH 整合。

3、分模块构建工程

4、会向私服上传 jar 包。会从私服下载jar

教学计划

课时

章节

知识点

备注

Maven 介绍

Maven 安装

入门程序 入门工程构建

Maven 介绍

了解

Maven 安装与配置

重点

Maven 项目工程目录约定

重点

入门程序 Maven 仓库 入门程序一常用的 maven命令

Maven 概念模型

Maven 仓库

重点

常用的 maven 命令

重点

Maven 概念模型

了解

项目构建

M2e 插件安装配置

重点

坐标定义

重点

构建 web 工程

重点

Eclipse 下 maven 命令的使用

重点

生命周期

了解

依赖管理

Tomcat 插件

添加依赖

重点

依赖范围

重点

Tomcat 插件

重点

 

 

3 maven 介绍

3.1maven 是什么

maven 翻译为 “专家”,“ 内行”。Maven 是 Apache 下的一个纯 java 开发的开源项目, 它是一个项目管理工具 ,使用 maven 对 java 项目进行构建、依赖管理。当前使用 Maven 的 项目在持续增长。

3.2 什么是项目构建

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

3.2.1传统项目构建过程

传统的使用 eclipse 构建项目的过程如下:


1)  在 eclipse 中创建一个 java web 工程构建过程如下 :

2)  在工程中编写源代码及配置文件等

3)  对源代码进行编译 ,java 文件编译成 class 文件

4)   执行 Jun it 单元测试

5)  将工程打成 war 包部署至 tomcat 运行

3.2.2 maven 项目构建过程

 maven 将项目构建 的过程进行标准化,每个阶段使用一个命令完成,下图展示了构建过程的一些阶段 ,后面章节详细介绍每个阶段 ,这里先大概了解下 :

上图中部分阶段对应命令如下:

清理阶段对maven的命令是clean,清理输出的 class 文件

编译阶段对maven的命令是compile,将java代码编译成class文件。

打包阶段对应maven的命令是package,java工程可以打成jar包,web包可以打成war包

运行一个maven工程( web工程)需要一个命令:tomat:run 

maven 工程构建的优点:

1、一个命令完成构建、运行,方便快捷。

2、maven对每个构建阶段进行规范,非常有利于大型团队协作开发。

3.3 什么是依赖管理

  什么是依赖?一个java项目可能要使用一些第三方的jar包才可以运行,那么我们说这个java项目依赖了这些第三方的jar包。

  举个例子 :一个crm系统,它的架构是SSH框架,该crm项目依赖、SSH框架,具体它 依赖的Hibernate、Spring、Struts2。

  什么是依赖管理?就是对项目所有依赖的jar包进行规范化管理。

 

3.3.1传统项目的依赖管理

  传统的项目工程要管理所依赖的jar包完全靠人工进行,程序员从网上下载jar包添加到项目工程中,如下图:程序员手工将Hibernate、struts2、spring的jar添加到工程中的WEB-INF/lib目录下。

 

手工拷贝jar包添加到工程中的问题是:

1、没有对jar包的版本统一管理,容易导致版本冲突。

2、从网上找jar包非常不方便,有些jar找不到。

3jar包添加到工程中导致工程过大。

 

3.3.2 maven  项目的依赖管理

  maven 项目管理所依赖的jar包不需要手动向工程添加jar包,只需要在 pom.xml(maven工程的配置文件添加jar包的坐标,自动从maven仓库中下载 jar包、运行,如下图:

 

使用maven依赖管理添加jar的好处:

1、通过pom.xml文件对jar包的版本进行统一管理,可避免版本冲突。

2maven团队维护了一个非常全的maven仓库,里边包括了当前使用的 jar包,maven工程可以自动从maven仓库下载jar包,非常方便。

 

3.4 使用maven的好处

通过上边介绍传统项目和maven项目在项目构建及依赖管理方面的区域,maven有如下的好处:

1、一步构建

maven对项目构建 的过程进行标准化,通过一个命令即可完成构建过程 。

2、依赖管理

maven工程不用于动导jar包,通过在pom.xml中定义坐标从maven仓库自动下载,方便且不易出错。

3maven 的跨平台,可在windowlinux上使用。

4maven遵循规范开发有利于提高大型团队的开发效率,降低项目的维护成本,大公司都会考虑使用maven来构建项目。

 

4 maven 安装

4.1 下载安装

• 下载

从该网站 http://maven.apache.org/download.cgi 下载 maven3.3.9版本

• 解压

maven 解压到一个不含有中文和空格的目录中 。

bin目录 mvn.bat (run方式运行项目)mvnDebug.bat(以debug方式运行项目)

boot目录 maven 运行需要类加载器

conf目录 settings.xml整个maven工具核心配置文件

lib 目录 maven运行依赖jar

 

4.2 环境变量配置

电脑上需安装java环境,安装JDKl.7+版本(JAVA_HOME/bin配置环境变量path )配置 MAVEN_HOME

%MAVEN_HOME%/bin加入环境变量path

通过 mvn -v 命令检查maven是否安装成功,看到maven的版本为3.3.9 java版本为 1.7即为安装成功。

4.3 maven 仓库

4.3.1 maven 仓库的作用

 

maven的工作需要从仓库下载一些jar包,如下图所示,本地的项目A、项目B 等都会通过maven软件从远程仓库(可以理解为互联网上的仓库)下载 jar包并存在本地仓库,本地仓库就是本地文件夹,当第二次需要此jar包时则不再从远程仓库下载,因为本地仓库己经存在了,可以将本地仓库理解为缓存,有了本地仓库就不用每次从远程仓库下载了。

 

下图描述了 maven 中仓库的类型:

 

本地仓库:用来存储从远程仓库或中央仓库下载的插件和jar包,项目使用一些插件或jar包,优先从本地仓库查找 

默认本地仓库位置在${use.dir}/.m2/repository,${user.dir}表示windows用户目录

 

远程仓库 :如果本地需要插件或者jar包,本地仓库没有,默认去远程仓库下载。远程仓库可以在互联网内也可以在局域网内。

中央仓库:在maven软件中内置一个远程仓库地址 http://repol.maven.org/maven2, 它是中央仓库,服务于整个互联网,它是由Maven 团队自己维护,里面存储了非常全的jar包,它包含了世界上大部分流行的开源项目构件。

 

4.3.2 配置本地仓库

 

本课程是在无网的状态下学习,需要配置老师提供的本地仓库,将repository.rar”解压至自己的电脑上,本教程解压在 F:\develop\maven\repository

 

MAVE_HOME/conf/settings.xml文件中配置本地仓库位置:

 

5 入门程序

 

5.1 学习目标

 

1、说出maven项目工程的目录结构是什么

2、在cmd命令行下测试maven的常用命令

 

5.2 maven 工程运行演示

通过使用maven提供的命令来运行maven工程,体会maven构建工程的优点。

 

5.2.1运行 web 工程

进入 maven 工程目录(当前目录有pom.xml文件),运行tomcat:run命令。

 

根据上边的提示信息 ,通过浏览器访 问:http://localhost:8080/maven-helloworld/

 

5.2.2 问题处理

如果本地仓库配置错误会报下边的错误

 

分析:

maven工程运行先从本地仓库找jar包,本地仓库没有 再从中央仓库找,上边提示downloading。。。表示从中央仓库下载jar,由于本地没有联网,报错。

 

解决:

maven安装目录的conf/setting.xml 文件中配置本地仓库 ,参考 :“maven 安装/配置本地仓库章节”。

使用 maven 创建的工程我们称它为 maven 工程,maven 工程具有一定的目录规范,如下:

src/main/java      存放项目的.java 文件

src/main/resources    存放项目资源文件,如 spring, hibernate 配置文件 src/test/java     存放所有单元测试.java 文件,如 J U nit 测试类 src/test/reso urces    测试资源文件

target 项目输出位置,编译后的class文件会输出到此目录

pom.xml maven 项目核心配置文件

 

5.4 常用的 maven 命令

 

cmd 的状态下测试

 

5.4.1compile

 

compilemaven工程的编译命令,作用是将src/main/java下的文件编译为class 文件输出到target目录下。

cmd 进入命令状态,执行mvn compile,如下图提示成功:

 

查看target目录,class文件己生成,编译完成。

 

5.4.2 test

testmaven工程的测试命令,会执行src/test/java下的单元测试类。

cmd执行mvn test执行src/test/java下单元测试类,下图为测试结果,运行1个测试用例,全部成功 。

 

5.4.3 clean

cleanmaven工程的清理命令,执行clean会删除target目录的内容。

 

5.4.4 package

packagemaven工程的打包命令,对于java工程执行package打成jar包,对于 web工程打成war包。

 

5.4.5 install

 

installmaven工程的安装命令,执行installmaven打成jar包或war包发布到本地仓库。

 

5.5 生命周期(了解)

 

5.5.1 三套生命周期

 

maven对项目构建过程分为主套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是:

Clean Lifecycle    在进行真正的构建之前进行一些清理工作

Default Lifecycle  构建的核心部分,编译,测试,打包,部署等等。

Site Lifecycle     生成项目报告,站点,发布站点。

5.5.2 生命周期的阶段

每个生命周期都有很多阶段,每个阶段对应一个执行命令。

1.如下是clean生命周期的阶段

pre-clean 执行一些需要在clean之前完成的工作

clean 移除所有上一次构建生成的文件

post-clean 执行一些需要在 clean 之后立刻完成的工作

 

2.如下是default周期的内容:

validate

generate-sources

process-sources

generate-resources

process-resources 复制并处理资源文件,至目标目录,准备打包。

compile  编译项目的源代码。

process-classes

generate-test-sources

process-test-sources

generate-test-resources

process-test-resources 复制并处理资源文件,至 目标测试目录

test-compile 编译测试源代码。

process-test-classes

test 使用合适的单元测试框架运行测试 。这些测试代码不会被 打包或部署。

prepare-package

package 接受编译好的代码 ,打包成可发布的格式 ,如 JAR

pre-integration-test

integration-test

post-integration-test

verify

install 将包安装至本地仓库 ,以让其它项目依赖。

deploy 将最终的包复制到远程的仓库 ,以让其它开发人员与项目共享。

 

3. 如下是 site 生命周期的阶段

pre-site  执行一些需要在生成站点文档之前完成的工作

site  生成项目的站点文档

post-site  执行一些需要在生成站点文档之后完成的工作 ,并且为部署做准备

site-deploy  将生成的站点文档部署到特定的服务器上

 

5.5.3  命令与生命周期的阶段

 

每个maven命令对应生命周期的某个阶段,例如:mvn clean命令对应clean 生命周期的clean阶段,mvn test命令对应default生命周期的test阶段。

执行命令会将该命令在的在生命周期当中之前的阶段自动执行,比如:执行 mvn clean命令会自动执行pre-cleanclean两个阶段,mvn test命令会自动执行 validatecompiletest等阶段。

注意:执行某个生命周期的某个阶段 不会影响其它的生命周期! 如果要同时执行多个生命周期的阶段可在命令行输入多个命令,中间以空格隔开,例如:

clean package  该命令执行clean生命周期的clean阶段和default生命周期的package阶段。

 

5.6 maven 的概念模型

 

Maven包含了一个项目对象模型(Project Object Model),一组标准集合,一个项目生命 周期( Project Lifecycl时,一个依赖管理系统( Dependency  Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin) 目标(goal)的逻辑。

下图是 maven 的概念模型图:

 

   项目对象模型 Project Object Model)

一个maven工程都有一个pom.xml文件,通过pom.xml文件定义项目的坐标、项目依赖、 项目信息、插件目标等。

 

依赖管理系统( Dependency Management System)

通过maven的依赖管理对项目所依赖的jar包进行统一管理。

比如:项目依赖junit4.9,通过在 pom.xml中定义junit4.9 的依赖即使用junit4.9,如下所示是junit4.9的依赖定义:

 

一个项目生命周期刊「oject Lifecycle)

使用maven完成项目的构建,项目构建包括:清理、编译、测试、部署等过程,maven将这些过程规范为一个生命周期,如下所示是生命周期的各各阶段:

 

maven 通过执行一些简单命令 即可实现上边生命周期的各各过程 ,比如执行mvn compile 执行编译、执行mvn clean执行清理。

 

• 一组标准集合

maven将整个项目管理过程定义一组标准,比如:通过maven构建工程有标准的目录结构,有标准的生命周期阶段、依赖管理有标准的坐标定义等。

 

插件(plugin)目标(goal)

maven  管理项目生命周期过程都是基于插件完成的。

 

6 项目构建

 

6.1 学习目标

 

1、独立在 eclipse 中安装配置 maven 插件

2、说出 maven 坐标的含义

3、使用 eclipse 创建 mavan 工程 (java工程及java web工程)

4、使用 eclipse 运行 maven 的命令

 

 

6.2 m2e 插件安装配置

 

6.2.1eclipse maven

 

通过入门程序中命令行的方式使用 maven 工作效率不高 ,可以在 eclipse 开发工具中集成maven软件,eclipse 是一个开发工具,maven 是一个项目管理工具,maven 有一套项目构建的规范,在 eclipse 集成 maven 软件,最终通过 eclipse 创建 maven 工程。

 

6.2.2 插件安装

 

本教程使用 eclipse mars2 版本,此版本自带maven 插件不用单独安装。 在新建窗口中可看到 maven  项目的创建项表示 maven 插件己存在,如下图:

 

6.2.3 指定 maven 安装目录

 

一些高版本的 ecli pse 己经内置了 maven 的安装,下图是 eclipse mars2 版本中己经内置了 maven3.3.3 版本,项目为了统一 maven 的版本不会使用 eclipse 内置的 maven 版本,这里我们 maven3.3.9

 

6.2.4 User Setting 配置

 

eclipse 中配置使用的 maven setting.xml 文件,使用 maven 安装目录下的 setting.xml文件。

 

注意:如果修改了setting.xml 文件需要点击上图中的“update settings” 按钮对本地仓库重建索引,点击“Reindex”。

eclipse 浏览仓库

maven 配置完成需要测试在 eclipse 中是否可以浏览 maven 的本地仓库,如果可以正常浏览 maven 本地仓库则说明 eclipse 集成 maven 己经完成。

打开 eclipse 仓库视图 ,对插件和 jar包建立索引

 

找到 Local respository 本地仓库项,点击 Rebuild index 重建索引

 

重建索引完成点击前边 “+” 图标即可查看本地仓库的内容:如下图:

 

6.3 定义 maven 坐标

 

每个 maven 工程都需要定义本工程的坐标,坐标是 maven jar 包的身份定义,比如:入门程序的坐标定义如下 :

 

6.4 构建 web 工程

 

6.4.1需求

 

创建一个 web 工程 ,实现入门程序的功能 。

1) 添加 index.  p,输出 hello world

2)  添加一个 servlet 转发到 jsp 页面。

 

6.4.2 第一步创建 maven 工程

 

选择 Maven Project

 

 

了解一下骨架界面:

当我们不跳过骨架点击next ” 会进入骨架选择页面,如果 eclipse 中配置本地仓库正确则显示出骨架:

 

选择 weba pp 会创建一个 maven  工程 (java  web  工程) 选择 quickstart 会创建一个 maven  工程 (java  工程)

注意:使用骨架的问题是创建的 maven 工程目录不完整,所以不推荐使用,本教程创建 maven工程统一跳过骨架。

6.4.3 第二步定义坐标

 

6.4.4 第三步设置编译版本

 

查看上边工程的编译版本为 1.5,本教程使用 jdkl. 7,需要设置编译版本为 1.7, 这里需要使用 maven 的插件来设置:

pom.xml 中加入:

 

 

执行 update project ,查看编译版本为 1.7:

 

6.4.5 第四步定义 web.xml

 

src/weba pp  中添加 WEB-I N F/web.xml 文件,内容为:

 

6.4.6 第五步编写 servlet

src/main/java 中创建 ServletTest

 

6.4.7 第六步编写 jsp

 

 

6.4.8 第七步添加 servlet/jsp jar

 

servlet 类中报错,无法解析 javax. sevlet....

 

maven 工程中添加 jar 的方式是需要在 pom .xml  中添加 servlet/jsp  的坐标,maven 自动从创建下载 servlet/jsp jar

 

编辑 pom.xml时,如下:

 

6.4.9 第八步配置 servlet

 

web.xm l 中配置 servl时,如下所示:

 

6.4.10运行

 

cmd 命令行进入工程 目录,运行 tomcat :ru n 命令

 

6.5 eclipse 下使用 maven 命令

 

eclipse 下测试命令

clean

compile

test

package

Install

 

Run as 采用 mvn 命令运行 ,Debug as 采用 mvn Debug 命令调试方式运行 (可打断点)

Maven clean 清理 target 目录 Maven test 执行单元测试

Maven install 将工程打包后发布到本地仓库

Maven build  使用之前操作过的命令

Maven build .. 手动输入命令内容 ,如下图:

 

 

•编译命令 mvn compile

编译后 .class 文件在 target/classes 下(这个命令只会对 java 源程序编译,不会编译测试代码, 编译测试类 mvn test-compi le,编译后.class 文件在 ta get\test-classes )

 

•测试命令 mvn  test

执行所有测试用例方法, 重新编译

 

 

•清除命令 mvn clean

清除 target 目录  (清除所有编译结果或者打包结果),清理后编译。

 

•打包命名 mvn package

java 项目生成 jar 包,web 项目生成 war 包 默认生成 jar 包名称 :artifactld-version.jar

 

• 安装命令

安装命令 mvn install   将工程打包后发布到本地仓库

-安装到仓库/groupld/artifactld/version 目录

 

7 依赖管理 - 添加依赖

 

7.1 需求

 

实现 web 工程整合 struts2 框架。

 

7.2 添加依赖

 

7.2.1dependency

 

porn.xml 中添加 dependency 标签,如下:

 

7.2.2 查找坐标

 

添加依赖需要指定依赖 jar 包的坐标 ,但是很多情况我们是不知道 jar 包的的坐标,可 以通过如下方式查询:

• 方法一:从互联网搜索

http://search.maven.org/

http://mvnrepository.com/

网站搜索示例:

 

 

 方法二 :使用 maven 插件的索引功能

如果在本地仓库有我们耍的jar包,可以在 pom.xml 中邮件添加依赖

 

7.3 构建 web 工程

 

7.3.1添加 struts2 依赖

 

编写 web 工程的 pom.xml  文件,添加依赖,如下

 

7.4 依赖范围

7.4.1基本概念

 

A 依赖 B,需要在A pom.xml 文件中添加 B 的坐标,添加坐标时需要指定依赖范围, 依赖范围包括:

compile:编译范围,指 A 在编译时依赖、B,此范围为默认依赖范围 。编译范围的依赖会用在编译、测试、运行,由于运行时需要所以编译范围的依赖会被打包。

provided: provided 依赖、只有在当 JDK 或者一个容器己提供该依赖之后才使用,provided依赖在编译和测试时需要,在运行时不需要,比如:servlet api tomcat 容器提供。

runtime:runtime  依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如:

jdbc  的驱动包。由于运行时需要所以 runtime 范围的依赖会被打包。

test:  test 范围依赖在编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用,比如:jun it。由于运行时不需要所以test 范围依赖不会被打包。

system:  system 范围依赖、与 provided 类似 ,但是你必须显式的提供一个对 于本地系统中

JAR 文件的路径 ,需要指定 systemPath 磁盘路径,system 依赖不推荐使用

 

maven-web 工程中测试各各 scop

 

测试总结

默认引入 jar 包 一一  compile   【默认范围 可以不写】 (编译、测试、运行都有效 )

servlet-api , jsp-api 一 provided 编译、测试 有效,运行时无效 防止和 tomcatjar 冲突)

jdbc 驱动 jar 包 一 runtime 测试、运行 有效

junit  test (测试有效)

依赖范围 由强到弱的顺序是 compile>provided>runtime>test

 

7.4.2 测试

 

1、 web 工程添加 jsp/servlet 依赖

 

package  war 观察 jsp-api servlet-api 是否在 war  中存在?

 

2、向工程添加 jdbc 依赖

 

package  wa观察 mysql-connctor-java  是否在 war 中存在?

 

7.5 完整的 pom.xml

 

根据需求 web  工程要实现整合 struts2,完整的 pom.xml 如下:

 

 

 

7.6 action

 

编写 action ,实现查询客户信息:

 

struts.xml

 

src/main/resources 创建 struts.xml

 

7.8 web.xml

 

web.xml 中配置 struts2 的前端控制器

 

8  maven 工程运行调试

 

8.1 tomcat 插件

 

maven 内置 tomcat 的插件 Corg.codeh a us.mojo. tomcat-maven-plugin ) ,执行 tomcat :run 命令 即可启动 tomcat

 

访问:http://localhost:8080/工程名/...

可以通过配置 plugin 修改 tomcat 的访问路径及端口:

 

8.2 端口占用处理

 

重新执行 tomcat:run 命令重启工程,重启之前需手动停止 tomcat,否则报下边的错误:

 

8.3 断点调试

maven 工程断点调试必须采用“Debug As”方式启动 ,并且需要引入源码才可源码跟踪:

 

 

引入源码:

 

添加,选择本工程:

 

以 debug 方式运行:

 

9 总结

 

6.4 maven 仓库

 

1maven 仓库的类型有哪些?

2maven  工程查找仓库的流程是什么 ?

3、本地仓库如何配置 ?

 

 

9.2 常用的 maven 命令

 

常用 maven 命令包括 :

compile :编译

clean:清理

test:测试

package:打包

install:安装

 

9.3 坐标定义

 

pom.xml 中定义坐标,内容包括:group Idartifactldversion,详细内容如下:

 

9.4 porn 基本配置

 

pom.xml maven 项目的核心配置文件,位于每个工程的根目录,基本配置如下:

<project>  :文件的根节点 .

<modelversion> : pom.xml 使用的对象模型版本

<groupld>:  项目名称,一般写项目的域名

<artifactld> :模块名称,子项目名或模块名称

<version>: 产品的版本号.

<packaging>:  打包类型,一般有 jarwarporn

<name> :项 目的显示名,常用于 Maven 生成的文档。

<description> :项目描述,常用于Maven 生成的文档

<dependencies> :项目依赖构件配置,配置项 目依赖、构件的坐标

<build>:项目构建配置,配置编译、运行插件等 。

posted @ 2019-01-26 14:07  狼的本性  阅读(256)  评论(0编辑  收藏  举报