Maven总结
1.什么是Maven
Maven是apache下的开源项目,项目管理工具,管理java项目
maven定义一套项目生命周期:清理、初始化、编译、测试、报告 、打包、部署、站点生成
2.Maven环境搭建
(一)Maven下载
可以到maven的官网下载 http://maven.apache.org/download.cgi
我们将下载的压缩包解压到D盘根目录,D盘根目录会有下面的文件夹
(二)本地仓库配置
1. 拷贝本地仓库
在D盘创建一个文件夹,名为repository
2. 配置本地仓库
打开maven的安装目录中conf/ settings.xml文件,在这里配置本地仓库:
<localRepository>D:\repository</localRepository>
这里的意思是配置本地仓库的目录为D:\repository
远程仓库配置:
<mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>
(三)eclipse配置Maven
1. 配置Maven的安装目录
进入eclipse ,选择菜单windows - Preferences , 在左侧的树状导航中
点击add按钮,弹出窗口后选择maven的安装目录
然后点击Apply
2. 配置User Settings
选择左侧树形导航的User Settings ,选择Maven目录下conf下的settingsxml
然后点击Update Settings 、Reindex 和Apply按钮.
选择菜单 window --> show View
选择 Rebuild Index 重新创建索引
(四)Idea配置Maven
1、配置maven路径
2、设置maven仓库
三、Maven入门
(一)创建Java工程
1. 选择菜单 File ->New->Project
坐标包括:
Group Id:项目的名称,项目名称以域名的倒序,比如:com.gh.maventtest
Artifact Id:模块名称(子项目名称)
Version:模块的版本,snapshot(快照版,没有正式发行)、release(正式发行版本)
点击Finish 。完成后如下图
工程目录结构说明:
project
/src/main/java 主体程序 java源文件(不要放配置文件)
/src/main/resources 主体程序所需要的配置文件(不要放java文件)
/src/test/java 单元测试程序 java源文件
pom.xml Maven进行工作的主要配置文件。
2. 编写代码
(1)在src/main/java 目录下创建包com.gh.maventest
(2)在包com.gh.maventest下创建HelloWorld 类
package com.hp.maventest; public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!!"); } }
(二)添加依赖
打开pom.xml,输入以下信息
<dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.28</version> </dependency> </dependencies>
我们再看工程目录下的Maven Dependecies 下又多了jar包
(三)创建web项目
填写项目名等信息,项目构建完成之后看到如下内容
注意:使用该模板创建的项目只有web目录没有java资源目录。我们需要在main下创建java目录并把java目录变成classpath目录。另外还要创建一个配置目录,用来存放配置文件,一般名字是resources
添加之后加入tomcat即可运行这个web项目,运行后显示首页说明创建成功
(四)项目生命周期
Maven有三套相互独立的生命周期,分别是:clean、default、site。clean主要是清理项目、default是Maven最核心的的构建项目、site是生成项目站点
(1)clean周期:
pre-clean:准备清理
clean:真正的清理工作
post-clean:执行清理后的一些后续工作
(2)default周期:
validate:验证
initialize:初始化配置
generate-sources:生成源代码编译目录
process-sources:处理项目主资源文件,复制资源文件到outputclasspath
generate-resources:生成资源目录
process-resources:处理资源文件
compile:编译源代码
process-classes:处理编译后文件
generate-test-sources:生成测试目录
process-test-sources:处理项目测试资源文件,复制测试资源文件到outputclasspath
generate-test-resources:生成测试资源文件
process-test-resources:处理测试资源文件
test-compile:编译测试代码
process-test-classes:处理测试代码
test:单元测试运行测试代码
prepare-package:打包前的准备
package:将编译好的代码打包成为jar或者war或者ear等等
pre-integration-test:准备整体测试
integration-test:整体测试
post-integration-test:为整体测试收尾
verify:验证
install:安装到本地Maven库
deploy:将最终包部署到远程Maven仓库
(3)site周期:
pre-site:准备生成站点
site:生成站点及文档
post-site:站点收尾
site-deploy:将生成的站点发布到服务器上
(五)常见命令
maven通过命令对工程进行清理、编译、测试、打包、部署。
点击工程右键 ,Run As (或Debug As ) -- > Maven Build ...
常用命令如下:
compile:编译
clean:清理,将target下的class文件清理
test: 执行单元测试类,执行src/test/java下的类
package :将java工程打成jar、war。
install:安装命令,将将程的jar发布到本地仓库
发布到仓库,目录按照本工程定义的坐标生成目录
四、使用maven集成ssm
需要引入的依赖如下,把这些复制到pom.xml中
<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.14.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>4.3.14.RELEASE</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.2</version> </dependency> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.28</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>compile</scope> </dependency> </dependencies>
把已经整合好的ssm项目直接复制到这里,步骤如下:把web.xml中的webapp内容全部复制进来,
由于这里使用的是c3p0的连接池,因此需要修改连接池的配置,在applicationContext-dao.xml中修改,代码如下:
在运行时还会报错,找不到User ServiceImpl类,原因是没有加载User Mapper.xml的文件,需要把这个文件放到配置文件夹中,不能放在Java资源目录中,因为它不会去解析。需要注意的是要在配置目录中新建一个和namespace路径相同的文件夹,把这个配置文件放进去,否则还是找不到。这个文件夹要一步步的创建,不能一次性创建。
配置完成之后运行,能够正常的跑起来实现功能说明已经整合成功,就可以进行分模块整合了。
五、聚合与继承
所谓聚合,顾名思义,就是把多个模块或项目聚合到一起,我们可以建立一个专门负责聚合工作的Maven 工程。
我们在项目开发的过程中,可能多个模块独立开发,但是多个模块可能依赖相同的元素,比如说每个模块都需要Junit,使用spring的时候,其核心jar也必须都被引入,在编译的时候,maven-compiler-plugin插件也要被引入。这时我们采用继承,就不用在每个子模块分别定义了。
聚合和继承通常是结合使用的,但是其作用是不同的。聚合是将多个模块的工程汇聚到一起,而继承则是指明某个模块工程要继承另一个模块功能
六、构建多模块Maven工程(重点)
6.1创建Maven父工程模板
先创建一个名为parent的maven项目,记得进入settings修改maven配置,在pom.xml中添加一行代码,表明这是一个父工程,那么它不能用来开发,不能有jar包或war包,是一个管理者,需要在里面新建模块。
然后在项目上右键创建一个模块,名为son1,
创建之后,查看parent的pom文件,此时多了一个模块,parent下载管理son1,创建多个模块就构成了聚合.
在son1的pom文件中有parent的配置,这里就继承了父类,有聚合不一定有继承,有继承也不一定有聚合,
工程创建完成后打开pom.xml ,添加内容
<!--设置jdk的版本是1.8--> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> <!--导入依赖--> <dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.28</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.14.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>4.3.14.RELEASE</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.2</version> </dependency> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>compile</scope> </dependency> </dependencies>
然后在son1中创建一个工具类,点击install放到仓库中,在son2中依赖之后就可以使用这个工具类。如果多个子模块同时依赖某些相同的jar包,那么可以把这些依赖放在父类的配置中,子模块中都会自动依赖这些jar包。如果添加dependencyManagement这个标签,那么可以进行依赖管理,在需要依赖的子模块中添加依赖,实现版本的控制管理。也可以把版本号抽取出来,实现版本的统一
<!--抽取共有的版本号--> <properties> <sprimg.version>4.3.14.RELEASE</sprimg.version> </properties>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <!--使用共有的版本号--> <version>${sprimg.version}</version> </dependency>
模板创建成功之后就可以参考步骤创建下面的模块。一共需要建立4个子模块:
entity 存放实体包
dao 存放数据访问接口及实现类
service 存放业务逻辑层接口及实现类
web 存放action类代码和前端代码 (注意:此模块的packaging选择war)
把写好的ssm工程按照模块划分到每一个项目中
第一步:创建一个maven的java项目,添加<packaging>pom</packaging>到配置文件
第二步:创建entity等模块,web需要创建web工程,引用模板
第三步:依赖
6.2模块之间的依赖
依赖关系:web-->service-->dao-->entity
选中parent创建install放到仓库中,然后依次设置依赖。
修改web.xml配置,让其加载所有配置文件:
classpath 和 classpath* 区别:
classpath:只会到你指定的class路径中查找找文件;
classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找
项目的分层图
6.3运行测试及打包
选择parent工程,执行命令package 进行打包(war),添加tomcat,运行项目进行测试。
七、依赖管理
(一)依赖范围
依赖范围是用来控制依赖与3种classpath(编译classpath,测试classpath,运行classpath)的关系。maven有以下几种依赖范围:
1、compile 编译、测试、运行,A在编译时依赖B,并且在测试和运行时也依赖。
strus-core、spring-beans。打到war包或jar包。
2、provided 编译、和测试有效,A在编译和测试时需要B。
比如:servlet-api就是编译和测试有用,在运行时不用(tomcat容器已提供)。不会打到war。
3、runtime:测试、运行有效。
比如:jdbc驱动包 ,在开发代码中针对java的jdbc接口开发,编译不用。
在运行和测试时需要通过jdbc驱动包(mysql驱动)连接数据库,需要的!!会打到war。
4、test:只是测试有效,只在单元测试类中用。
比如:junit。不会打到war。
如何设置依赖范围呢?
比如我们要将mysql驱动的依赖设置为runtime范围,配置如下:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> <scope>runtime</scope> </dependency>
将servlet依赖设置为provided
<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency>
如果是compile就不需要设置了,因为compile是scope的默认值。关于test范围我们在后边讲解单元测试时再做演示。重新执行打包为war , 会发现servlet-api.jar已经不存在。