Maven-项目构建技术(工具)

时间:2022-04-17 18:55:53

Maven-项目构建技术(工具)

主要的内容目标:如何创建项目、如何导入jar、如何进行其他配置、如何管理生命周期

今天的主要安排:

  1. maven的概述(为什么要用?是什么)
  2. 快速入门(配置、名词解释、使用命令行来构建)
  3. Eclipse插件的快速入门使用(配置、使用插件构建项目-java项目和web项目)
  4. 应用详解:
    1. 仓库---是什么?能干什么?分类
    2. POM配置详解
    3. 依赖(讲解如何去自动依赖其他的项目---jar)
    4. ssh的POM参考

5.多模块和继承(将一个大的工程分解为多个子模块工程)

6.插件(覆盖插件的参数,如:tomcat端口更改等)

  1. Maven的概述和技术简介

    1. 项目开发中的问题

Maven-项目构建技术(工具)

  1. 什么是maven

Maven这个单词来自于意第绪语(犹太语),意为知识的积累,最早在Jakata Turbine项目中它开始被用来试图简化构建过程。

扩展:之前有个构建项目的工具叫ant。

Maven-项目构建技术(工具)

Maven的概念:

Maven-项目构建技术(工具)

几个概念:

  • POM 项目对象模型(规范,xml文件-管理maven项目)
  • 标准集合(标准的规范约定)-骨架
  • 项目(工程)生命周期—从开发角度来说
  • 依赖管理系统 (开发项目工程需要依赖其他的项目(构件)--jar)
  • 插件(maven的具体功能,是靠插件完成)(本身核心很小—想用它,需要用一些依赖的东东)

Maven的核心思想:

Maven-项目构建技术(工具)

每个公司都有自己的开发规范(打包规范、编译环境),这其实就是一种约定。

使用maven进行项目管理,很多环节内容是约定好的。可以更好的敏捷开发。

maven的作用:

Maven-项目构建技术(工具)

学习过程中参考图书:

Maven-项目构建技术(工具)

Maven管理项目的周期:

Maven-项目构建技术(工具)

  1. Maven的快速入门

    1. Maven的下载安装

官方网站:http://maven.apache.org/

下载页面:http://maven.apache.org/download.cgi

官网的系列版本:

Maven-项目构建技术(工具)

版本选择问题:

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

本课程选用3.1.1

Maven-项目构建技术(工具)

Windows环境请下载maven zip 包:

Maven-项目构建技术(工具)

解压maven的zip包 (注意解压的路径,建议不要有中文、空格、特殊符号)

Maven-项目构建技术(工具)

提示:maven本身的包很小,要想实现功能是通过插件来使用的。

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

  1. Maven的配置

配置JDK环境:

Maven-项目构建技术(工具)

我们所使用的3.1系列版本最低的jdk要求是1.5或以上。

因此,我们要确认系统中安装的jdk版本,并且将JAVA_HOME/bin加入到环境变量path中。

配置maven的环境变量:

  • MAVEN_HOME=maven压缩包解压目录。

    Maven-项目构建技术(工具)

    提示:后面的maven新版本官方建议配置:M2_HOME= maven压缩包解压目录

    如果有非常老的maven项目的话,可能还需要配置MAVEN_HOME

  • 在path环境变量中,增加 %MAVEN_HOME%\bin

Maven-项目构建技术(工具)

%M2_HOME%/bin;

测试是否配置成功:

重新打开cmd窗口,运行:mvn -v

出现下图的信息,说明环境配置正确且生效了:

Maven-项目构建技术(工具)

  1. Maven仓库配置

什么是仓库?

仓库用来管理maven打包后的项目的(还包括插件项目,还包括其他依赖的项目、还),

再简单的说,仓库就是为了存放管理项目(构件)的。

仓库的位置是通过maven的核心配置文件(settings.xml)来配置的。

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

发现:默认的仓库位置是在当前登录用户的home目录下:

Maven-项目构建技术(工具)

修改默认仓库位置为自定义的仓库位置:

新建repository文件夹:

Maven-项目构建技术(工具)

在核心配置文件中增加仓库的位置的配置:

Maven-项目构建技术(工具)

settings.xml的其他配置(参考)

Maven-项目构建技术(工具)

  1. 本地仓库的建立

Maven要运行使用,需要一些插件(插件是一些项目,但项目不一定是插件,可能是一些依赖的项目)来支持,这些插件需要联网下载(而且,是自动下载的,必须联网,下载的东东,会缓存到本地仓库。)

如果没有网络,(maven会优先从本地仓库中寻找,如果没有则上网下载) 将下发 "本地仓库"中的已经下载好的仓库内容,解压到仓库文件夹:

Maven-项目构建技术(工具)

注意:注意解压文件的目录层次!

扩展:里面目录是很多可以依赖项目和一些插件。

  1. Maven名词解释(预备知识)

Maven-项目构建技术(工具)

相关概念的关系:

新建maven工程称之为project, 每个maven工程都包含 pom.xml 描述文件(maven工程的核心配置文件)

一个工程区分其它工程的方式,是通过Artifact( groupId(组)和 ArtifactId(唯一标识)—)来区分的。

一个工程可以通过 dependency(依赖的jar包) 依赖其它工程

Maven的核心配置文件Setting和工程的pom文件的区别?

Setting文件是Maven这个管理工具的全局整体配置,比如配置仓库的位置等。

POM.xml是某个具体的maven工程的配置描述。

  1. 构建helloworld工程项目(命令行方式)

新建一个目录用来存放maven工程:

Maven-项目构建技术(工具)

打开cmd窗口,可使用Maven Archetype插件的create命令创建maven项目:

mvn archetype:create -DgroupId=cn.itcast.maven.quickstart -DartifactId=simple -DarchetypeArtifactId=maven-archetype-quickstart

命令参数解释:

groupId 组名(默认为java包名)

artifactId 唯一标识 (默认情况下为项目名称,我们这里叫simple)

archetypeArtifactId 骨架(用来决定项目结构,选择什么骨架,就会生成什么样的项目结构,骨架一般都是现成的固定好的,我们这里的骨架叫maven-archetype-quickstart)

执行命令:会在当前目录下生成simple的工程:

Maven-项目构建技术(工具)

分析一下项目结构:

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

Maven项目结构是标准的:

  • pom.xml 位于工程根目录,对项目进行配置,任何一个maven项目都有。
  • src/main/java 存放项目源码 (源码和测试代码是分开的)
  • src/test/java 存放项目测试代码

提示:只要使用相同的骨架,则生成的项目的结构都是一样的。

测试:再建立一个simple2的项目后,发现项目目录结构是一致的。

Maven-项目构建技术(工具)

  1. 操作项目工程(命令行方式)

常用的Maven命令行指令:

Maven-项目构建技术(工具)

格式:mvn+目标goal(插件的名字)

想要执行mvn命令,需要进入工程所在目录 (即进入到pom.xml 所在目录)

注意:所有的mvn命令都必须针对pom.xml运行 !

【示例】常用的maven命令-组合命令:

  • 编译命令 mvn compile

    Maven-项目构建技术(工具)

    作用:在工程目录生成target目录,将源码(\src\main)编译为class文件,存放在target/classes目录。

    提示:如果对测试代码编译,需要执行mvn test-compile 在target/test-classes 生成class文件 ,结果:

    Maven-项目构建技术(工具)

  • 清除命令 mvn clean

    作用:清除编译后的结果,会删除target目录及相关文件。

  • 测试命令 mvn test

    作用:运行测试,会先对代码自动编译,生成target目录和测试报告。

    提示:Maven会自动先编译再自动运行测试。

  • 打包命令 mvn package

    作用:Java项目 自动打成 jar包;Web项目 自动打成war包。

    结果:

    Maven-项目构建技术(工具)

提示:该文件名的名字为:工程名字(其实是artifactID)-版本号-版本性质.打包方式

另外:如果打包的时候不想执行测试(跳过测试),可以执行:

mvn package -Dmaven.test.skip=true

  • 安装命令 mvn install

    作用:将项目打包后,安装到仓库(repository)中

    提示:mvn clean install组合写法:先clean,在安装

    Maven-项目构建技术(工具)

    Maven-项目构建技术(工具)

看出:安装到的仓库目录是有一定规律的,是固定的,格式如下:

${仓库根目录}/groupId/artifactId/version/xxx.jar

可以再次安装simple2来测试查看结构情况。

Maven-项目构建技术(工具)

补充:artifact(艺术品)=/groupId/artifactId/version/xxx.jar(项目)

构建Maven项目生命周期(完整)

  • 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 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。

提示:生命周期从上到下执行,如果执行后面命令,自动执行之前项目构建步骤。

  1. Maven项目转化为其它项目—了解

目标:将maven项目导入到开发工具环境中,如Eclipse等。

Maven提供了一些向常用开发工具转换的命令参数:

Maven-项目构建技术(工具)

【示例】

将simple的maven项目转换为eclipse项目:

mvn eclipse:eclipse

打印的日志:

Maven-项目构建技术(工具)

说明:这是调用的maven的一个插件,插件的名字叫:maven-eclipse-plugin

注意:转换的时候,需要相关的转换eclipse插件(本地仓库中已经有了)。

Maven-项目构建技术(工具)

将转换后的项目导入到eclipse中:

Maven-项目构建技术(工具)

提示:如果要导入到myeclipse中,java工程基本没问题,但web工程有些问题。可以参考:

Maven-项目构建技术(工具)

【示例】

清除eclipse的项目信息:

mvn eclipse:clean

如何了解一个插件的详细用法呢?

Maven-项目构建技术(工具)

【示例】了解显示插件的详细信息(命令参数等)

mvn help:describe -Dplugin=eclipse //简单一些帮助

mvn help:describe -Dplugin=eclipse -Ddetail//更详细的帮助

  1. m2Eclipse快速入门

    1. m2Eclipse是什么

m2Eclipse是一款便捷使用maven的Eclipse插件。

安装该插件的目的是让eclipse直接支持maven的开发。

  1. 下载安装

该插件可以到官网下载:http://eclipse.org/m2e/

但新版的Eclipse都默认内置安装了该插件(Eclipse3.5之前的没有),因此几乎不需要安装。

而MyEclipse也内置了自己的一个插件叫Maven4MyEclipse,功能和m2eclipse差不多一样。

如果没有这个插件,安装也很简单,将插件解压后复制eclipse/dropins,重启Eclipse即可。

Maven-项目构建技术(工具)

检查插件是否安装好,检查Eclipse中的配置(在菜单栏点击Window->Preferences,打开参数配置窗口)中是否有如下菜单:

Eclipse

MyEclipse

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

  1. 插件配置

本节,我们以myeclipse为例进行讲解(和Eclipse差不多一致)。

首先:找到MyEclipse的配置中的maven插件所在位置,在相应菜单进行配置。

必须需要配置两个地方:

  • 一个maven的安装目录
  • 一个是当前用户的核心配置文件的位置

第一个地方:指定maven的安装位置--installations

Maven-项目构建技术(工具)

提示:里面有个默认内置的,这里我们使用自己解压的maven。

第二个地方:指定maven配置文件(setting.xml)的位置—User Setting

Maven-项目构建技术(工具)

提示:默认这个文件的位置是指向当前用户的目录下的文件位置。

注意:配置完成后一定要点击"update settings"按钮来更新配置,然后点击"Reindex" 按钮对仓库中项目重建索引(用于搜索)

另外,对插件的配置上的一个优化,可参考下图:

Maven-项目构建技术(工具)

  1. 构建工程项目(使用插件)

下面,我们分别使用maven插件建立简单java项目和web项目。

  1. 使用quickstart骨架建立简单java项目

新建一个maven项目:

Maven-项目构建技术(工具)

下一步:

Maven-项目构建技术(工具)

提示:我们本次准备使用的quickstart骨架,因此,这里不能选择跳过骨架选择!

下一步:骨架选择

Maven-项目构建技术(工具)

提示1:如果第一次加载这个页面会比较慢。

提示2:打开后默认选中的骨架就是quickstart骨架。

下一步:配置maven工程的参数:

Maven-项目构建技术(工具)

点击finish完成工程创建。

提示:如果跳出来一个错误,基本上会是你的仓库中没有这个骨架和相关插件,请检查你的仓库是否配置正确!当然,如果能联网,会自动下载相应的插件。

建立起来的工程目录结果—简单的java项目结构:

Maven-项目构建技术(工具)

要看到工程中所有的文件,可以通过导航视图来查看:

Maven-项目构建技术(工具)

提示:myeclipse下,当工程保存的时候,会自动编译。

右键run as 查看能够使用maven 命令

Maven-项目构建技术(工具)

通过手动输入命令,来执行mvn package命令:

Maven-项目构建技术(工具)

注意:这里不需要输入mvn了!

查看打出来的jar:

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

  1. 建立web项目(使用骨架和不使用骨架)

本节,我们使用两种方式建立maven的web项目:

  • 使用webapp骨架创建项目
  • 不使用骨架创建项目(使用maven的内置的默认的约定)

第一种方式:使用webapp骨架创建项目

新建maven项目,不跳过骨架选择,

Maven-项目构建技术(工具)

选择webapp骨架

Maven-项目构建技术(工具)

下一步:

Maven-项目构建技术(工具)

点击finish完成项目创建,结构如下:

Maven-项目构建技术(工具)

提示:

目录结构遵循的约定梳理:

  • src/main/resources 存放项目中配置文件 log4j.xml,applicationContext.xml等
  • 但没有提供源码存放包需要手动建立 src/main/java 存放源码
  • src/main/webapp 相当于之前的WebRoot

运行web项目:使用maven内置的tomcat插件(tomcat-maven-plugin)。

运行命令:tomcat:run

Maven-项目构建技术(工具)

提示:

该tomcat是内置的,和外面的tomcat没有关系。是内置运行的,每个tomcat都是独立运行的。它会在target中临时生成本次运行的tomcat的环境:

Maven-项目构建技术(工具)

测试访问:

Maven-项目构建技术(工具)

第二种方式:不使用骨架创建项目。即跳过骨架选择,自动生成maven项目的目录结构(几乎完整-常用)

新建maven项目,选择跳过骨架选择:

Maven-项目构建技术(工具)

下一步,配置项目信息:

Maven-项目构建技术(工具)

点击finish完成项目创建。

效果:

Maven-项目构建技术(工具)

提示:这种方法创建的项目目录结构很完整,但就缺少了一个web.xml文件,可以从别的项目中复制过来。

Maven-项目构建技术(工具)

分析:生成的项目目录结构的约定:

  • src/main/java 存放项目源码
  • src/main/resources 存放项目配置文件
  • src/test/java 存放测试源码
  • src/test/resources 存放测试配置文件
  • src/main/webapp存放页面代码

缺点: 没有web.xml 但可以复制一个进去

补充:如果用myeclipse2014或者你用新版的eclipse开发,可能连WEB-INF都没有。

测试:创建一个主页index.jsp,启动tomcat进行测试。

【如何选择哪种方式?】

推荐使用跳过骨架选择方式,这样生成目录结构最完整 !

  1. maven应用详解

注意:本节概念原理较多,需要注意理解。

Maven-项目构建技术(工具)

  1. 仓库

maven项目管理,依赖于两大类仓库(三种仓库):

Maven-项目构建技术(工具)

  • 本地仓库:在之前的maven核心配置文件settings.xml 配置指定

Maven-项目构建技术(工具)

可以将网络上项目缓存到本地仓库 (当本地项目依赖网络上项目的时候,会自动下载缓存)

可以将自己开发项目也部署到本地仓库 mvn install

  • 远程仓库:网络上仓库(分两种)
    • *仓库(当本地项目依赖其它项目,而依赖的项目本地没有,maven就会自动到网络上的*仓库去找)-官服

      Maven-项目构建技术(工具)

    • 公司内部搭建服务器--私服(可以快速下载仓库,还可以存放公司内部私密的一些项目)

Maven-项目构建技术(工具)

扩展提示:*仓库虽然是最大网络远程仓库,但里面管理jar包,也并不是企业开发全部(有些jar包需要到厂商的私服中下载,如JBOSS私服、Spring私服、Oracle私服)

查看仓库:

打开Maven仓库视图:

Maven-项目构建技术(工具)

可以查看到本地仓库和远程仓库的树形列表:

Maven-项目构建技术(工具)

对本地仓库建立索引:

Maven-项目构建技术(工具)

提示:建议大家都重建一下索引,后面在使用的时候会用到。

如果不想从*仓库自动获取索引,可以将其禁用:

Maven-项目构建技术(工具)

  1. POM配置详解

可以理解为:pom.xml就是用来管理我们的maven的项目。(maven工程的核心配置文件,用来管理maven工程Project)

查看POM的内容

可以通过MyEclipse的POM Editor来查看:

Maven-项目构建技术(工具)

提示:这个编辑器eclipse有。

  1. POM的全景图

Pom.xml文件是maven工程项目的核心配置文件。

它的所有配置和环境都在这张图上:

Maven-项目构建技术(工具)

大致分下面几类:

坐标(Coordinates): groupId、artifactId、version

聚合(Aggregation): modules (一个项目可以分N个模块)

继承(Inhefitance): parent、 dependencyManagement

依赖(Dependences): dependences

项目工程2信息(Project Information): name、description、url…

构建配置(Build Settings): properties、 packaging(打包方式)、 build (构建信息)、reporting(报告)

环境信息(Environment):…

【关于POM的三个概念】:自定义POM、超级POM、有效POM

  • 自定义的POM(最小POM)就是用户创建的工程中的那个POM文件,内容较少;
  • 超级POM位于maven的内部,拥有POM的所有默认配置。
  • 有效POM=自定义POM+超级POM

所有自定义的pom.xml 都默认继承 "超级POM文件"(maven内置的),成为有效的POM。

【了解】超级POM的位置:

%MAVEN_HOME% /lib/maven-model-builder-3.0.4.jar中的\org\apache\maven\model\pom-4.0.0.xml,它是所有Maven POM的父POM,所有Maven项目继承该配置。

Maven-项目构建技术(工具)

查看有效POM的内容。

提示:超级POM默认指向的是*仓库。

问题:有效POM的内容可以更改么?

可以!通过自定义POM,可以覆盖超级POM的内容。

  1. POM核心配置说明

pom.xml是Maven项目的核心配置文件,位于每个工程的根目录,指示Maven工作的元数据文件。

Maven-项目构建技术(工具)

我们先掌握和了解几个基本的核心配置。

  • <project > :文件的根节点。(固定的)
  • <modelversion > :pom.xml使用的对象模型版本(一般也都是4.0.0版本)

Maven-项目构建技术(工具)

  • <groupId > :创建项目的组织或团体的唯一Id。
  • <artifactId > :项目的唯一Id, 可视为项目名。
  • <version > :产品的版本号。

    注意:这三个称之为项目坐标,因为这三个组合在一起可以唯一锁定项目在仓库中的位置,因此,如果要寻找一个项目,先要获得其项目坐标,格式:仓库/groupId/artifactId/version/项目包(jar、war)

Maven-项目构建技术(工具)

  • <packaging > :打包类型,一般有jar、war、pom 等

Maven-项目构建技术(工具)

Maven构建项目默认提供常见三种打包类型:

  • jar包 ------- 简单java项目
  • war包 ----- web项目
  • pom ----- 父项目,提供pom被子项目继承
  • <name > :项目的显示名,常用于 Maven 生成的文档。
  • <description > :项目描述,常用于 Maven 生成的文档

Maven-项目构建技术(工具)

问题:关于artifactId、name、工程名是否必须一致?

三者可以不一致!

其作用区别是什么?

Maven-项目构建技术(工具)

通过两个测试:

  • 如果使用tomcat:run 运行项目,访问项目通过 artifactId 属性
  • 在项目编译打包、安装部署,还是使用artifactId属性

通过测试发现:Name属性只是用来生成文档中显示,不会影响到工程发布和打包等,写什么都无所谓。而工程本身的名字也对工程发布和打包没有影响,也无所谓。

  1. 构建依赖 (dependencies)(重点)

什么是依赖构建,就是在项目之间,通过配置,可以进行自动依赖构建。

提示:依赖项目可以是第三方的,也可以是自己编写的。

  1. 通过坐标导入jar包

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

引入依赖的方法:

在一个项目可以在pom.xml中 通过配置 <dependencies> 来引入对其它项目的依赖。

引入依赖的思路原理:

坐标决定项目在仓库中唯一位置,我们就可以通过坐标来导入依赖项目,即可以理解为:可以通过坐标导入jar包 。

【示例】 在项目导入struts2和spring的需要jar包。

思考:要导入jar,首先要得到其坐标,那么怎么得到坐标呢?

两种方式:

Maven-项目构建技术(工具)

方法一:

在网站搜索项目,获取对应坐标。

如:http://mvnrepository.com/

现在推荐使用"开源中国"网站来搜索(速度快)

比如搜索spring的核心jar:

Maven-项目构建技术(工具)

列出所有版本:

Maven-项目构建技术(工具)

选择一个版本,如3。2。0,点击进去::

Maven-项目构建技术(工具)

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>3.2.0.RELEASE</version>

</dependency>

将依赖的这段坐标文字复制到pom.XML中后,保存,即可看到效果:

Maven-项目构建技术(工具)

提示:所有的依赖都必须放到<dependencies>标签元素中,即一个项目可以依赖多个其他项目。如下图:

<dependencies>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>3.2.0.RELEASE</version>

</dependency>

</dependencies>

Spring官方的:

Maven-项目构建技术(工具)

方法二:通过本地索引加入坐标。(struts2的依赖包)

这里也有两种操作方式打开添加依赖的菜单:

在工程上右击,或者在POM.xml文件上右击,都会出现下面的菜单:

Maven-项目构建技术(工具)

提示:前提是必须建立索引(本地索引)

Maven-项目构建技术(工具)

提示1:优先会找本地仓库,本地仓库找不到再去*仓库找,如果*仓库索引被禁用,则不会去*仓库找。

提示2:如果有的jar不完整,没有下载完的,导入的时候会报错。(如果你联网的话,导入任何的可以索引到的项目,(如果本地仓库没有)都自动从网络上获取。)

点击OK后:

Maven-项目构建技术(工具)

思考:为什么只导入核心core一个jar,但会导入这么多?

原因是:这个core的jar包会依赖其他jar,其本身的项目中的POM会描述其依赖的jar。

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

因此:只需要导入struts2core坐标,struts2又会依赖其它项目,会自动导入其它项目jar包。

通过编辑器的依赖树视图(dependency hierarchy)功能,查看项目依赖关系

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

【示例】导入struts2的json插件

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

【示例】将spring等框架需要的log4j的jar通过本地索引导入进来:

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

【扩展】

jar、bundle:显示jar是maven认为标准的打包了。bundle,maven认为打的jar不标准,不推荐使用。

【示例】导入aspectJ的jar

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

提示:如果本地仓库没有相应版本的jar,会自动到*仓库去找,然后自动下载,并缓存到本地。如将asepectj的版本换成本地没有的1.7.0,会自动下载并替换原来的版本。

  1. 依赖的相关配置

完整的dependency 配置如下:

Maven-项目构建技术(工具)

  • groupId、artifactId、version是依赖的基本坐标,"缺一不可",其它两个坐标元素不指定时将采用默认值(找到jar的位置)(当version没有的情况下,会自动使用依赖默认的版本)
  • type:依赖的类型,对应坐标packaging方式,(它通常表示依赖的文件的扩展名),默认为jar。
  • optional:标记依赖是否可选。A->B->C,那么当A依赖于C时就可以设为可选。一般不配置。
  • exclusions:排除传递依赖,即某些依赖项目不想导入进来。(主要用来解决版本冲突问题)

【示例】排除log4j依赖的mail.jar

在依赖视图中,找到mail,点击右键:

Maven-项目构建技术(工具)

Ok后,点击保存。效果如下:

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

应用场景:当两个依赖项目都依赖于另外一个项目的不同版本的时候,就可以通过排除依赖,将不要的版本排除掉。

maven依赖有个特性:如果你依赖一个项目的两个版本,maven只会导入一个版本的项目。

  • 依赖范围: scope

Maven-项目构建技术(工具)

提示:可以通过有效pom来查看默认值。

详细解释:

  • compile :编译需要,打包需要 (大多数的jar都是这种)-默认值

【示例】对mavendemo3进行打包操作,查看包内应该有所有的jar。

  • provided :编译需要,不会被打包 (servlet、jsp)

【示例】新建一个helloServlet,需导入servletjar,但只需要在编译的时候用,不需要打包。

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

  • runtime: 编译不需要,打包运行时需要(jdbc驱动)

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

  • test: 参与测试,不会打包 (junit)

【示例】新建一个junit测试用例,导入junit的jar

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

  • system :指向本地系统jar包 (不推荐,jar不在仓库 )

Maven-项目构建技术(工具)

【scope小结】

Maven-项目构建技术(工具)

  1. 传递性依赖和统一版本管理

什么是传递性依赖?

传递性依赖也称之为间接依赖。

Maven-项目构建技术(工具)

问题:如果两个jar,同时依赖与另外一个jar的不同版本,就可能导致jar冲突问题。这就是传递依赖的Jar版本冲突问题。

Struts2整合Spring需要struts2-spring-plugin的jar,该jar会依赖于spring。

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

将插件挑换位置,到Spring之前,发现,spring的版本号都变了:

Maven-项目构建技术(工具)

提示:依赖是有顺序的!

那么maven是如何选择版本的呢?(maven的依赖调节策略)

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

从上图可以看出,对于core的jar,两个路径相同,谁先声明加载(谁在上面),就用谁的版本。

解决传递依赖的问题的方案:

方案一:解决间接依赖 最好方式,就是直接依赖 (直接依赖 优先 间接依赖 )

如,直接导入3。2。0版本的spring-core的jar:

Maven-项目构建技术(工具)

方案二: 锁定版本。

在需要的版本上,点击右键,选择锁定。

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

小结:解决版本冲突问题的方案:

  • 排除(项目)版本
  • 锁定版本
  • 直接依赖-
  • 调整引入的顺序

关于版本的另一个知识点:统一维护版本

Maven-项目构建技术(工具)

<!-- 定义本地属性 -->

<properties>

<spring.version>3.2.0.RELEASE</spring.version>

<struts2.version>2.3.15.2</struts2.version>

</properties>

  1. maven构建ssh项目

目标:使用maven整合SSH,可将storemanager系统重构。

步骤参考:

  1. 通过坐标导入ssh框架开发jar包
  2. 根据maven约定项目结构编写代码
  3. 通过tomcat-maven-plugin运行项目

第一步: 新建maven项目 mavenstore,使用跳过骨架

Maven-项目构建技术(工具)

第二步: 通过maven坐标完成SSH整合(由于有传递依赖的情况,我们按一定顺序导入。可参考课前资料提供的pom文件)

导入spring:spring context,spring aspectj,spring web,spring test,spring orm(整合hibernate),spring context support(缓存使用的)

导入hibernate:hibernate core)

导入struts2:struts2 core,struts2 json(json插件),struts2 spring (spring整合spring)
    导入日志相关:slf4j log4j(slf4j整合log4j的包)

导入连接池:c3p0

导入数据库驱动:mysql(mysql驱动)oracle驱动—注意是runtime的scope

导入缓存:ehcache

导入servlet、jsp、(注意是provided范围scope)、jstl

导入junit:(注意是test范围)

统一维护版本:

Maven-项目构建技术(工具)

第三步: 复制项目代码

java代码 --- src/main/java

配置文件 ---- src/main/resources

注意:hbm、struts2校验文件 属于配置文件 ,放入src/main/resources

原来src:cn.itcast.storemanger.domain/store.hbm.xml

maven:cn.itcast.storemanger.domain/store.hbm.xml

Maven-项目构建技术(工具)

WebRoot下页面 ---- src/main/webapp

WEB-INF --- WEB-INF (但不要复制 lib、classes)

第四步: tomcat:run 运行项目

Maven-项目构建技术(工具)

测试:tomcat:run

  1. 多模块和继承

Maven-项目构建技术(工具)

多模块解决: 将maven项目分解,为了统一管理和开发方便;

继承解决 : 使用pom配置,为了复用和整合的问题;

提示:两者虽然概念不同,但在企业中会一起使用。

多模块:将一个大工程分成几个小的工程便于开发。

继承:多个模块之间有关系,主要是指子模块和父工程之间的继承关系。

  1. 概念

  • 多模块

Maven-项目构建技术(工具)

  • 继承

Maven-项目构建技术(工具)

  1. 构建示例

【示例】使用eclipse工具进行父子工程构建

目标:构建一个父工程,两个子工程,让父工程管理子工程。

第一步:建立父工程

提示:打包方式 必须为pom

生成的工程:

Maven-项目构建技术(工具)

查看pom.xml文件(打包方式发生改变):

Maven-项目构建技术(工具)

提示:父工程的作用:就是用来操作子工程的,用来被继承的。

第二步: 建立两个子模块项目,引用父工程。

新建maven子模块项目:

Maven-项目构建技术(工具)

提示:模块主要用于将项目分解,每个人可以分别开发自己的那部分模块。

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

生成的工程:

Maven-项目构建技术(工具)

在子工程中指定父工程(自动由向导完成了)

Maven-项目构建技术(工具)

在父工程中指定要管理的子模块工程(自动由向导完成了)

Maven-项目构建技术(工具)

再建立一个子工程:

Maven-项目构建技术(工具)

查看父工程的pom

Maven-项目构建技术(工具)

扩展分析:

其实工具已经将我们的父子关系都建立好了。如果不用这个工具会是个什么步骤呢?

第一步:建立父工程。(pom)

第二步:建立子模块工程。(jar,war)

第三步:在子工程中配置指定父工程(目的是复用父工程的东东—比如jar)。

Maven-项目构建技术(工具)

第四步:在父工程中配置指定要管理的子模块工程。

Maven-项目构建技术(工具)

提示:此时两个工程已经有父子关系了,即继承关系,下面我们做一些测试:

【测试】:

1.继承:父工程导入jar包,子工程会自动导入父工程导入的jar包。

在父工程中导入一个junit的jar,看子工程是否可以用junit,并且发现子工程中有了这个依赖:

Maven-项目构建技术(工具)

2.统一操作:只对父工程进行构建操作,就会同时操作管理各个子模块

对父工程进行编译、清理、打包或安装操作。

小结:

多模块为了统一管理(聚合),而继承是为了复用。

  1. 项目分解

项目的分解:可以从两个角度来,一个是业务角度(业务模块,不同的业务模块),一个是代码开发角度(分层,一个人认领一个层,每个层独立开发,最终整合到一起)

  • 多模块:将SSH案例按照业务模块或者服务器分层拆分为多个module
  • 继承:使用继承,将公共配置放入到父pom中

第一步: 建立父工程 (公共配置,统一管理)

Maven-项目构建技术(工具)

在父项目配置 jar依赖,版本管理:

Maven-项目构建技术(工具)

第二步: 按三层划分

web项目 + service项目+ dao项目 + domain项目(注意依赖的顺序)

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

只有web项目是打包为war

Maven-项目构建技术(工具)

构建的项目为:

Maven-项目构建技术(工具)

【注意】父pom配置模块不能更改顺序

Maven-项目构建技术(工具)

子模块项目的内容构建:将各个模块所属的内容放入各个模块项目中。

注意两点:

  1. 工程之间的依赖关系:

web依赖service , service依赖dao, dao依赖domain

每个工程需要单独引入依赖关系,如dao依赖domain的引入:

Maven-项目构建技术(工具)

  1. spring配置文件的分解和引入

Maven-项目构建技术(工具)

  1. 生命周期-了解

Maven-项目构建技术(工具)

Maven提供三套生命周期

  • mvn clean 清理生命周期
  • mvn install 项目构建生命周期
  • mvn site 生成站点生命周期
  1. 插件

Maven-项目构建技术(工具)

因此:在maven整个生命周期的全过程,每个环节都是通过插件来完成的。

Maven-项目构建技术(工具)

  1. maven-compiler-plugin编译插件

Maven-项目构建技术(工具)

  1. maven-surefire-plugin测试插件

主要功能是输出日志和报告。

Maven-项目构建技术(工具)

可解决两个问题:

1.中文乱码问题

解决方法:通过覆盖超级pom的默认配置来增加一个配置属性

<build>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-surefire-plugin</artifactId>

<version>2.7.1</version>

<configuration>

<argLine>-Dfile.encoding=UTF-8</argLine>

</configuration>

</plugin>

</plugins>

</build>

Maven-项目构建技术(工具)

2.跳过测试

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

Maven-项目构建技术(工具)

测试失败仍然执行。

  1. tomcat-maven-plugin使用 tomcat

使用tomcat:run 命令,默认使用 tomcat-maven-plugin:1.1 运行 ,使用8080端口

如何修改端口?

添加插件:

Maven-项目构建技术(工具)

<plugin>

<groupId>org.codehaus.mojo</groupId>

<artifactId>tomcat-maven-plugin</artifactId>

<version>1.1</version>

<configuration>

<!—可选,指定端口-->

<port>9090</port>

</configuration>

</plugin>

Maven-项目构建技术(工具)

乱码:

Maven-项目构建技术(工具)

覆盖为utf-8

Maven-项目构建技术(工具)

小结:

  1. 理解maven的思想,以及几个相关的概念
  2. 应用上的一些概念
    1. 仓库(本地和远程(*和私服))
    2. Pom.xml各种配置
    3. 依赖—导入jar,排除jar、解决传递性依赖(直接依赖、锁定版本)、统一版本控制。

作业:案例:参考ssh整合好的pom.xml---将原来的仓库的项目移植到maven的项目中。(两次)

  1. 多模块和继承:父子关系、通过父模块操作子模块、子模块可以继承工程的依赖等等。案例做一做

    作业:项目的分解

4.插件了解---知道命令中使用的插件都对应哪些?如何覆盖插件的参数,比如tomcat端口。