Maven-项目构建技术(工具)
主要的内容目标:如何创建项目、如何导入jar、如何进行其他配置、如何管理生命周期
今天的主要安排:
- maven的概述(为什么要用?是什么)
- 快速入门(配置、名词解释、使用命令行来构建)
- Eclipse插件的快速入门使用(配置、使用插件构建项目-java项目和web项目)
-
应用详解:
- 仓库---是什么?能干什么?分类
- POM配置详解
- 依赖(讲解如何去自动依赖其他的项目---jar)
- ssh的POM参考
5.多模块和继承(将一个大的工程分解为多个子模块工程)
6.插件(覆盖插件的参数,如:tomcat端口更改等)
-
Maven的概述和技术简介
项目开发中的问题
什么是maven
Maven这个单词来自于意第绪语(犹太语),意为知识的积累,最早在Jakata Turbine项目中它开始被用来试图简化构建过程。
扩展:之前有个构建项目的工具叫ant。
Maven的概念:
几个概念:
- POM 项目对象模型(规范,xml文件-管理maven项目)
- 标准集合(标准的规范约定)-骨架
- 项目(工程)生命周期—从开发角度来说
- 依赖管理系统 (开发项目工程需要依赖其他的项目(构件)--jar)
- 插件(maven的具体功能,是靠插件完成)(本身核心很小—想用它,需要用一些依赖的东东)
Maven的核心思想:
每个公司都有自己的开发规范(打包规范、编译环境),这其实就是一种约定。
使用maven进行项目管理,很多环节内容是约定好的。可以更好的敏捷开发。
maven的作用:
学习过程中参考图书:
Maven管理项目的周期:
-
Maven的快速入门
Maven的下载安装
下载页面:http://maven.apache.org/download.cgi
官网的系列版本:
版本选择问题:
本课程选用3.1.1
Windows环境请下载maven zip 包:
解压maven的zip包 (注意解压的路径,建议不要有中文、空格、特殊符号)
提示:maven本身的包很小,要想实现功能是通过插件来使用的。
Maven的配置
配置JDK环境:
我们所使用的3.1系列版本最低的jdk要求是1.5或以上。
因此,我们要确认系统中安装的jdk版本,并且将JAVA_HOME/bin加入到环境变量path中。
配置maven的环境变量:
-
MAVEN_HOME=maven压缩包解压目录。
提示:后面的maven新版本官方建议配置:M2_HOME= maven压缩包解压目录
如果有非常老的maven项目的话,可能还需要配置MAVEN_HOME
- 在path环境变量中,增加 %MAVEN_HOME%\bin
%M2_HOME%/bin;
测试是否配置成功:
重新打开cmd窗口,运行:mvn -v
出现下图的信息,说明环境配置正确且生效了:
Maven仓库配置
什么是仓库?
仓库用来管理maven打包后的项目的(还包括插件项目,还包括其他依赖的项目、还),
再简单的说,仓库就是为了存放管理项目(构件)的。
仓库的位置是通过maven的核心配置文件(settings.xml)来配置的。
发现:默认的仓库位置是在当前登录用户的home目录下:
修改默认仓库位置为自定义的仓库位置:
新建repository文件夹:
在核心配置文件中增加仓库的位置的配置:
settings.xml的其他配置(参考)
本地仓库的建立
Maven要运行使用,需要一些插件(插件是一些项目,但项目不一定是插件,可能是一些依赖的项目)来支持,这些插件需要联网下载(而且,是自动下载的,必须联网,下载的东东,会缓存到本地仓库。)
如果没有网络,(maven会优先从本地仓库中寻找,如果没有则上网下载) 将下发 "本地仓库"中的已经下载好的仓库内容,解压到仓库文件夹:
注意:注意解压文件的目录层次!
扩展:里面目录是很多可以依赖项目和一些插件。
Maven名词解释(预备知识)
相关概念的关系:
新建maven工程称之为project, 每个maven工程都包含 pom.xml 描述文件(maven工程的核心配置文件)
一个工程区分其它工程的方式,是通过Artifact( groupId(组)和 ArtifactId(唯一标识)—)来区分的。
一个工程可以通过 dependency(依赖的jar包) 依赖其它工程
Maven的核心配置文件Setting和工程的pom文件的区别?
Setting文件是Maven这个管理工具的全局整体配置,比如配置仓库的位置等。
POM.xml是某个具体的maven工程的配置描述。
构建helloworld工程项目(命令行方式)
新建一个目录用来存放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项目结构是标准的:
- pom.xml 位于工程根目录,对项目进行配置,任何一个maven项目都有。
- src/main/java 存放项目源码 (源码和测试代码是分开的)
- src/test/java 存放项目测试代码
提示:只要使用相同的骨架,则生成的项目的结构都是一样的。
测试:再建立一个simple2的项目后,发现项目目录结构是一致的。
操作项目工程(命令行方式)
常用的Maven命令行指令:
格式:mvn+目标goal(插件的名字)
想要执行mvn命令,需要进入工程所在目录 (即进入到pom.xml 所在目录)
注意:所有的mvn命令都必须针对pom.xml运行 !
【示例】常用的maven命令-组合命令:
-
编译命令 mvn compile
作用:在工程目录生成target目录,将源码(\src\main)编译为class文件,存放在target/classes目录。
提示:如果对测试代码编译,需要执行mvn test-compile 在target/test-classes 生成class文件 ,结果:
-
清除命令 mvn clean
作用:清除编译后的结果,会删除target目录及相关文件。
-
测试命令 mvn test
作用:运行测试,会先对代码自动编译,生成target目录和测试报告。
提示:Maven会自动先编译再自动运行测试。
-
打包命令 mvn package
作用:Java项目 自动打成 jar包;Web项目 自动打成war包。
结果:
提示:该文件名的名字为:工程名字(其实是artifactID)-版本号-版本性质.打包方式
另外:如果打包的时候不想执行测试(跳过测试),可以执行:
mvn package -Dmaven.test.skip=true
-
安装命令 mvn install
作用:将项目打包后,安装到仓库(repository)中
提示:mvn clean install组合写法:先clean,在安装
看出:安装到的仓库目录是有一定规律的,是固定的,格式如下:
${仓库根目录}/groupId/artifactId/version/xxx.jar
可以再次安装simple2来测试查看结构情况。
补充:artifact(艺术品)=/groupId/artifactId/version/xxx.jar(项目)
构建Maven项目生命周期(完整)
|
提示:生命周期从上到下执行,如果执行后面命令,自动执行之前项目构建步骤。
Maven项目转化为其它项目—了解
目标:将maven项目导入到开发工具环境中,如Eclipse等。
Maven提供了一些向常用开发工具转换的命令参数:
【示例】
将simple的maven项目转换为eclipse项目:
mvn eclipse:eclipse |
打印的日志:
说明:这是调用的maven的一个插件,插件的名字叫:maven-eclipse-plugin
注意:转换的时候,需要相关的转换eclipse插件(本地仓库中已经有了)。
将转换后的项目导入到eclipse中:
提示:如果要导入到myeclipse中,java工程基本没问题,但web工程有些问题。可以参考:
【示例】
清除eclipse的项目信息:
mvn eclipse:clean |
如何了解一个插件的详细用法呢?
【示例】了解显示插件的详细信息(命令参数等)
mvn help:describe -Dplugin=eclipse //简单一些帮助 mvn help:describe -Dplugin=eclipse -Ddetail//更详细的帮助 |
-
m2Eclipse快速入门
m2Eclipse是什么
m2Eclipse是一款便捷使用maven的Eclipse插件。
安装该插件的目的是让eclipse直接支持maven的开发。
下载安装
该插件可以到官网下载:http://eclipse.org/m2e/
但新版的Eclipse都默认内置安装了该插件(Eclipse3.5之前的没有),因此几乎不需要安装。
而MyEclipse也内置了自己的一个插件叫Maven4MyEclipse,功能和m2eclipse差不多一样。
如果没有这个插件,安装也很简单,将插件解压后复制eclipse/dropins,重启Eclipse即可。
检查插件是否安装好,检查Eclipse中的配置(在菜单栏点击Window->Preferences,打开参数配置窗口)中是否有如下菜单:
Eclipse |
MyEclipse |
插件配置
本节,我们以myeclipse为例进行讲解(和Eclipse差不多一致)。
首先:找到MyEclipse的配置中的maven插件所在位置,在相应菜单进行配置。
必须需要配置两个地方:
- 一个maven的安装目录
- 一个是当前用户的核心配置文件的位置
第一个地方:指定maven的安装位置--installations
提示:里面有个默认内置的,这里我们使用自己解压的maven。
第二个地方:指定maven配置文件(setting.xml)的位置—User Setting
提示:默认这个文件的位置是指向当前用户的目录下的文件位置。
注意:配置完成后一定要点击"update settings"按钮来更新配置,然后点击"Reindex" 按钮对仓库中项目重建索引(用于搜索)
另外,对插件的配置上的一个优化,可参考下图:
构建工程项目(使用插件)
下面,我们分别使用maven插件建立简单java项目和web项目。
使用quickstart骨架建立简单java项目
新建一个maven项目:
下一步:
提示:我们本次准备使用的quickstart骨架,因此,这里不能选择跳过骨架选择!
下一步:骨架选择
提示1:如果第一次加载这个页面会比较慢。
提示2:打开后默认选中的骨架就是quickstart骨架。
下一步:配置maven工程的参数:
点击finish完成工程创建。
提示:如果跳出来一个错误,基本上会是你的仓库中没有这个骨架和相关插件,请检查你的仓库是否配置正确!当然,如果能联网,会自动下载相应的插件。
建立起来的工程目录结果—简单的java项目结构:
要看到工程中所有的文件,可以通过导航视图来查看:
提示:myeclipse下,当工程保存的时候,会自动编译。
右键run as 查看能够使用maven 命令
通过手动输入命令,来执行mvn package命令:
注意:这里不需要输入mvn了!
查看打出来的jar:
建立web项目(使用骨架和不使用骨架)
本节,我们使用两种方式建立maven的web项目:
- 使用webapp骨架创建项目
- 不使用骨架创建项目(使用maven的内置的默认的约定)
第一种方式:使用webapp骨架创建项目
新建maven项目,不跳过骨架选择,
选择webapp骨架
下一步:
点击finish完成项目创建,结构如下:
提示:
目录结构遵循的约定梳理:
- src/main/resources 存放项目中配置文件 log4j.xml,applicationContext.xml等
- 但没有提供源码存放包需要手动建立 src/main/java 存放源码
- src/main/webapp 相当于之前的WebRoot
运行web项目:使用maven内置的tomcat插件(tomcat-maven-plugin)。
运行命令:tomcat:run
提示:
该tomcat是内置的,和外面的tomcat没有关系。是内置运行的,每个tomcat都是独立运行的。它会在target中临时生成本次运行的tomcat的环境:
测试访问:
第二种方式:不使用骨架创建项目。即跳过骨架选择,自动生成maven项目的目录结构(几乎完整-常用)
新建maven项目,选择跳过骨架选择:
下一步,配置项目信息:
点击finish完成项目创建。
效果:
提示:这种方法创建的项目目录结构很完整,但就缺少了一个web.xml文件,可以从别的项目中复制过来。
分析:生成的项目目录结构的约定:
- src/main/java 存放项目源码
- src/main/resources 存放项目配置文件
- src/test/java 存放测试源码
- src/test/resources 存放测试配置文件
- src/main/webapp存放页面代码
缺点: 没有web.xml 但可以复制一个进去
补充:如果用myeclipse2014或者你用新版的eclipse开发,可能连WEB-INF都没有。
测试:创建一个主页index.jsp,启动tomcat进行测试。
【如何选择哪种方式?】
推荐使用跳过骨架选择方式,这样生成目录结构最完整 !
maven应用详解
注意:本节概念原理较多,需要注意理解。
仓库
maven项目管理,依赖于两大类仓库(三种仓库):
- 本地仓库:在之前的maven核心配置文件settings.xml 配置指定
可以将网络上项目缓存到本地仓库 (当本地项目依赖网络上项目的时候,会自动下载缓存)
可以将自己开发项目也部署到本地仓库 mvn install
-
远程仓库:网络上仓库(分两种)
-
*仓库(当本地项目依赖其它项目,而依赖的项目本地没有,maven就会自动到网络上的*仓库去找)-官服
- 公司内部搭建服务器--私服(可以快速下载仓库,还可以存放公司内部私密的一些项目)
-
扩展提示:*仓库虽然是最大网络远程仓库,但里面管理jar包,也并不是企业开发全部(有些jar包需要到厂商的私服中下载,如JBOSS私服、Spring私服、Oracle私服)
查看仓库:
打开Maven仓库视图:
可以查看到本地仓库和远程仓库的树形列表:
对本地仓库建立索引:
提示:建议大家都重建一下索引,后面在使用的时候会用到。
如果不想从*仓库自动获取索引,可以将其禁用:
POM配置详解
可以理解为:pom.xml就是用来管理我们的maven的项目。(maven工程的核心配置文件,用来管理maven工程Project)
查看POM的内容
可以通过MyEclipse的POM Editor来查看:
提示:这个编辑器eclipse有。
POM的全景图
Pom.xml文件是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项目继承该配置。
查看有效POM的内容。
提示:超级POM默认指向的是*仓库。
问题:有效POM的内容可以更改么?
可以!通过自定义POM,可以覆盖超级POM的内容。
POM核心配置说明
pom.xml是Maven项目的核心配置文件,位于每个工程的根目录,指示Maven工作的元数据文件。
我们先掌握和了解几个基本的核心配置。
- <project > :文件的根节点。(固定的)
- <modelversion > :pom.xml使用的对象模型版本(一般也都是4.0.0版本)
- <groupId > :创建项目的组织或团体的唯一Id。
- <artifactId > :项目的唯一Id, 可视为项目名。
-
<version > :产品的版本号。
注意:这三个称之为项目坐标,因为这三个组合在一起可以唯一锁定项目在仓库中的位置,因此,如果要寻找一个项目,先要获得其项目坐标,格式:仓库/groupId/artifactId/version/项目包(jar、war)
- <packaging > :打包类型,一般有jar、war、pom 等
Maven构建项目默认提供常见三种打包类型:
- jar包 ------- 简单java项目
- war包 ----- web项目
- pom ----- 父项目,提供pom被子项目继承
- <name > :项目的显示名,常用于 Maven 生成的文档。
- <description > :项目描述,常用于 Maven 生成的文档
问题:关于artifactId、name、工程名是否必须一致?
三者可以不一致!
其作用区别是什么?
通过两个测试:
- 如果使用tomcat:run 运行项目,访问项目通过 artifactId 属性
- 在项目编译打包、安装部署,还是使用artifactId属性
通过测试发现:Name属性只是用来生成文档中显示,不会影响到工程发布和打包等,写什么都无所谓。而工程本身的名字也对工程发布和打包没有影响,也无所谓。
构建依赖 (dependencies)(重点)
什么是依赖构建,就是在项目之间,通过配置,可以进行自动依赖构建。
提示:依赖项目可以是第三方的,也可以是自己编写的。
通过坐标导入jar包
;
引入依赖的方法:
在一个项目可以在pom.xml中 通过配置 <dependencies> 来引入对其它项目的依赖。
引入依赖的思路原理:
坐标决定项目在仓库中唯一位置,我们就可以通过坐标来导入依赖项目,即可以理解为:可以通过坐标导入jar包 。
【示例】 在项目导入struts2和spring的需要jar包。
思考:要导入jar,首先要得到其坐标,那么怎么得到坐标呢?
两种方式:
方法一:
在网站搜索项目,获取对应坐标。
现在推荐使用"开源中国"网站来搜索(速度快)
比如搜索spring的核心jar:
列出所有版本:
选择一个版本,如3。2。0,点击进去::
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.2.0.RELEASE</version> </dependency> |
将依赖的这段坐标文字复制到pom.XML中后,保存,即可看到效果:
提示:所有的依赖都必须放到<dependencies>标签元素中,即一个项目可以依赖多个其他项目。如下图:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.2.0.RELEASE</version> </dependency> </dependencies> |
Spring官方的:
方法二:通过本地索引加入坐标。(struts2的依赖包)
这里也有两种操作方式打开添加依赖的菜单:
在工程上右击,或者在POM.xml文件上右击,都会出现下面的菜单:
提示:前提是必须建立索引(本地索引)
提示1:优先会找本地仓库,本地仓库找不到再去*仓库找,如果*仓库索引被禁用,则不会去*仓库找。
提示2:如果有的jar不完整,没有下载完的,导入的时候会报错。(如果你联网的话,导入任何的可以索引到的项目,(如果本地仓库没有)都自动从网络上获取。)
点击OK后:
思考:为什么只导入核心core一个jar,但会导入这么多?
原因是:这个core的jar包会依赖其他jar,其本身的项目中的POM会描述其依赖的jar。
因此:只需要导入struts2core坐标,struts2又会依赖其它项目,会自动导入其它项目jar包。
通过编辑器的依赖树视图(dependency hierarchy)功能,查看项目依赖关系
【示例】导入struts2的json插件
【示例】将spring等框架需要的log4j的jar通过本地索引导入进来:
【扩展】
jar、bundle:显示jar是maven认为标准的打包了。bundle,maven认为打的jar不标准,不推荐使用。
【示例】导入aspectJ的jar
提示:如果本地仓库没有相应版本的jar,会自动到*仓库去找,然后自动下载,并缓存到本地。如将asepectj的版本换成本地没有的1.7.0,会自动下载并替换原来的版本。
依赖的相关配置
完整的dependency 配置如下:
- groupId、artifactId、version是依赖的基本坐标,"缺一不可",其它两个坐标元素不指定时将采用默认值(找到jar的位置)(当version没有的情况下,会自动使用依赖默认的版本)
- type:依赖的类型,对应坐标packaging方式,(它通常表示依赖的文件的扩展名),默认为jar。
- optional:标记依赖是否可选。A->B->C,那么当A依赖于C时就可以设为可选。一般不配置。
- exclusions:排除传递依赖,即某些依赖项目不想导入进来。(主要用来解决版本冲突问题)
【示例】排除log4j依赖的mail.jar
在依赖视图中,找到mail,点击右键:
Ok后,点击保存。效果如下:
应用场景:当两个依赖项目都依赖于另外一个项目的不同版本的时候,就可以通过排除依赖,将不要的版本排除掉。
maven依赖有个特性:如果你依赖一个项目的两个版本,maven只会导入一个版本的项目。
- 依赖范围: scope
提示:可以通过有效pom来查看默认值。
详细解释:
- compile :编译需要,打包需要 (大多数的jar都是这种)-默认值
【示例】对mavendemo3进行打包操作,查看包内应该有所有的jar。
- provided :编译需要,不会被打包 (servlet、jsp)
【示例】新建一个helloServlet,需导入servletjar,但只需要在编译的时候用,不需要打包。
- runtime: 编译不需要,打包运行时需要(jdbc驱动)
- test: 参与测试,不会打包 (junit)
【示例】新建一个junit测试用例,导入junit的jar
- system :指向本地系统jar包 (不推荐,jar不在仓库 )
【scope小结】
传递性依赖和统一版本管理
什么是传递性依赖?
传递性依赖也称之为间接依赖。
问题:如果两个jar,同时依赖与另外一个jar的不同版本,就可能导致jar冲突问题。这就是传递依赖的Jar版本冲突问题。
Struts2整合Spring需要struts2-spring-plugin的jar,该jar会依赖于spring。
将插件挑换位置,到Spring之前,发现,spring的版本号都变了:
提示:依赖是有顺序的!
那么maven是如何选择版本的呢?(maven的依赖调节策略)
从上图可以看出,对于core的jar,两个路径相同,谁先声明加载(谁在上面),就用谁的版本。
解决传递依赖的问题的方案:
方案一:解决间接依赖 最好方式,就是直接依赖 (直接依赖 优先 间接依赖 )
如,直接导入3。2。0版本的spring-core的jar:
方案二: 锁定版本。
在需要的版本上,点击右键,选择锁定。
小结:解决版本冲突问题的方案:
- 排除(项目)版本
- 锁定版本
- 直接依赖-
- 调整引入的顺序
关于版本的另一个知识点:统一维护版本
<!-- 定义本地属性 --> <properties> <spring.version>3.2.0.RELEASE</spring.version> <struts2.version>2.3.15.2</struts2.version> </properties> |
maven构建ssh项目
目标:使用maven整合SSH,可将storemanager系统重构。
步骤参考:
- 通过坐标导入ssh框架开发jar包
- 根据maven约定项目结构编写代码
- 通过tomcat-maven-plugin运行项目
第一步: 新建maven项目 mavenstore,使用跳过骨架
第二步: 通过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范围)
统一维护版本:
第三步: 复制项目代码
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
WebRoot下页面 ---- src/main/webapp
WEB-INF --- WEB-INF (但不要复制 lib、classes)
第四步: tomcat:run 运行项目
测试:tomcat:run
多模块和继承
多模块解决: 将maven项目分解,为了统一管理和开发方便;
继承解决 : 使用pom配置,为了复用和整合的问题;
提示:两者虽然概念不同,但在企业中会一起使用。
多模块:将一个大工程分成几个小的工程便于开发。
继承:多个模块之间有关系,主要是指子模块和父工程之间的继承关系。
概念
- 多模块
- 继承
构建示例
【示例】使用eclipse工具进行父子工程构建
目标:构建一个父工程,两个子工程,让父工程管理子工程。
第一步:建立父工程
提示:打包方式 必须为pom
生成的工程:
查看pom.xml文件(打包方式发生改变):
提示:父工程的作用:就是用来操作子工程的,用来被继承的。
第二步: 建立两个子模块项目,引用父工程。
新建maven子模块项目:
提示:模块主要用于将项目分解,每个人可以分别开发自己的那部分模块。
生成的工程:
在子工程中指定父工程(自动由向导完成了)
在父工程中指定要管理的子模块工程(自动由向导完成了)
再建立一个子工程:
查看父工程的pom
扩展分析:
其实工具已经将我们的父子关系都建立好了。如果不用这个工具会是个什么步骤呢?
第一步:建立父工程。(pom)
第二步:建立子模块工程。(jar,war)
第三步:在子工程中配置指定父工程(目的是复用父工程的东东—比如jar)。
第四步:在父工程中配置指定要管理的子模块工程。
提示:此时两个工程已经有父子关系了,即继承关系,下面我们做一些测试:
【测试】:
1.继承:父工程导入jar包,子工程会自动导入父工程导入的jar包。
在父工程中导入一个junit的jar,看子工程是否可以用junit,并且发现子工程中有了这个依赖:
2.统一操作:只对父工程进行构建操作,就会同时操作管理各个子模块
对父工程进行编译、清理、打包或安装操作。
小结:
多模块为了统一管理(聚合),而继承是为了复用。
项目分解
项目的分解:可以从两个角度来,一个是业务角度(业务模块,不同的业务模块),一个是代码开发角度(分层,一个人认领一个层,每个层独立开发,最终整合到一起)
- 多模块:将SSH案例按照业务模块或者服务器分层拆分为多个module
- 继承:使用继承,将公共配置放入到父pom中
第一步: 建立父工程 (公共配置,统一管理)
在父项目配置 jar依赖,版本管理:
第二步: 按三层划分
web项目 + service项目+ dao项目 + domain项目(注意依赖的顺序)
…
只有web项目是打包为war
构建的项目为:
【注意】父pom配置模块不能更改顺序
子模块项目的内容构建:将各个模块所属的内容放入各个模块项目中。
注意两点:
- 工程之间的依赖关系:
web依赖service , service依赖dao, dao依赖domain
每个工程需要单独引入依赖关系,如dao依赖domain的引入:
- spring配置文件的分解和引入
生命周期-了解
Maven提供三套生命周期
- mvn clean 清理生命周期
- mvn install 项目构建生命周期
- mvn site 生成站点生命周期
插件
因此:在maven整个生命周期的全过程,每个环节都是通过插件来完成的。
maven-compiler-plugin编译插件
maven-surefire-plugin测试插件
主要功能是输出日志和报告。
可解决两个问题:
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> |
2.跳过测试
测试失败仍然执行。
tomcat-maven-plugin使用 tomcat
使用tomcat:run 命令,默认使用 tomcat-maven-plugin:1.1 运行 ,使用8080端口
如何修改端口?
添加插件:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>tomcat-maven-plugin</artifactId> <version>1.1</version> <configuration> <!—可选,指定端口--> <port>9090</port> </configuration> </plugin> |
乱码:
覆盖为utf-8
小结:
- 理解maven的思想,以及几个相关的概念
-
应用上的一些概念
- 仓库(本地和远程(*和私服))
- Pom.xml各种配置
- 依赖—导入jar,排除jar、解决传递性依赖(直接依赖、锁定版本)、统一版本控制。
作业:案例:参考ssh整合好的pom.xml---将原来的仓库的项目移植到maven的项目中。(两次)
-
多模块和继承:父子关系、通过父模块操作子模块、子模块可以继承工程的依赖等等。案例做一做
作业:项目的分解
4.插件了解---知道命令中使用的插件都对应哪些?如何覆盖插件的参数,比如tomcat端口。