[TOC] # Maven简介及搭建 ## 一、Maven简介 ### (一)什么是Maven > Maven是apache下的开源项目,项目管理工具,管理java项目。 1、项目对象模型 (Project Object Model) POM对象模型,每个maven工程中都有一个pom.xml文件,定义工程所依赖的jar包、本工程的坐标、打包运行方式。。 2、依赖管理系统(基础核心 ) maven通过坐标对项目工程所依赖的jar包统一规范管理。 3、maven定义一套项目生命周期 清理、初始化、编译、测试、报告 、打包、部署、站点生成 4、一组标准集合 强调:maven工程有自己标准的工程目录结构、定义坐标有标准。 5、maven 管理项目生命周期过程都是基于插件完成的 ![](https://box.kancloud.cn/148482bf9d9fbdd7a7f58cdbd9a53b3d_640x432.jpg) ### (二)Maven仓库 ![](https://box.kancloud.cn/d4a935ad26f14004ac0de14c1f390f0a_700x248.png) #### 1、中央仓库 > 就是远程仓库,仓库中jar由专业团队(maven团队)统一维护。 > 中央仓库的地址:http://repo1.maven.org/maven2/ #### 2、本地仓库 > 相当于缓存,工程第一次会从远程仓库(互联网)去下载jar 包,将jar包存在本地仓库(在程序员的电脑上)。第二次不需要从远程仓库去下载。先从本地仓库找,如果找不到才会去远程仓库找。 #### 3、私服 > 在公司内部架设一台私服,其它公司架设一台仓库,对外公开。 ## 二、Maven环境搭建 ### (一)Maven下载 > 可以到maven的官网下载 > http://maven.apache.org/download.cgi ![](https://box.kancloud.cn/34bb5bbb9deef1006970bcf33c2b1778_1067x183.png) > 我们将下载的压缩包解压到D盘根目录,D盘根目录会有下面的文件夹 ![](https://box.kancloud.cn/a422d8b6a592b165f12b8688e25f15b7_84x99.png) ### (二)本地仓库配置 #### 1. 拷贝本地仓库 > 将资料中的repository_ssh.zip解压到D盘 #### 2. 配置本地仓库 > 打开maven的安装目录中conf/ settings.xml文件,在这里配置本地仓库: ~~~ <localRepository>D:\repository_ssh</localRepository> 这里的意思是配置本地仓库的目录为D:\repository_ssh ~~~ ### (三)eclipse配置Maven #### 1. 配置Maven的安装目录 > 进入eclipse ,选择菜单windows - Preferences , 在左侧的树状导航中 ![](https://box.kancloud.cn/5f82cbaa0db4f9afc5ba723845e7f167_641x471.png) > 点击add按钮,弹出窗口后选择maven的安装目录 ![](https://box.kancloud.cn/bac541242bd9cb26b51b991588c11010_599x521.png) > 然后点击Apply ![](https://box.kancloud.cn/c874e9ce9a5d66f691e97a9295a598e7_637x467.png) #### 2. 配置User Settings ![](https://box.kancloud.cn/5cdace113094eaf7d321a289c061833f_690x470.png) > 选择左侧树形导航的User Settings ,选择Maven目录下conf下的settingsxml > 然后点击Update Settings 、Reindex 和Apply按钮. ### (四)重建本地仓库索引 > 选择菜单 window --> show View ![](https://box.kancloud.cn/82cdc642f1d30bc4b4026e42a22bfff8_607x661.png) > 选择 Rebuild Index 重新创建索引 ## 三、Maven入门 ### (一)创建工程 > 1. 选择菜单 File ->new -> Other ![](https://box.kancloud.cn/4241af7c74431b62b5676b346c216382_576x550.png) > 选择Maven下的Maven Project, Next > 2. 选中下图红框部分的复选框(跳过骨架),next ![](https://box.kancloud.cn/4f9f764cf9fb3ab14bc5be7df64153f0_586x441.png) > 3. 定义工程坐标 > maven对所有工程管理基于坐标进行管理 ![](https://box.kancloud.cn/959ed18fabf20c42709f75518a55bafe_678x643.png) > 坐标包括: ~~~ Group Id:项目的名称,项目名称以域名的倒序,比如:cn.itcast.mavendemo Artifact Id:模块名称(子项目名称) Version:模块的版本,snapshot(快照版,没有正式发行)、release(正式发行版本) 输入后,Finish 。完成后如下图 ~~~ ![](https://box.kancloud.cn/745d4477f47be13a4da8bebd08c12762_344x252.png) > 工程目录结构说明: > project | 文件路径 | 文件功能 | | --- | --- | | /src/main/java | 主体程序 java源文件(不要放配置文件) | | /src/main/resources | 主体程序所需要的配置文件(不要放java文件) | | /src/test/java | 单元测试程序 java源文件 | | /src/test/resources | 单元测试程序所用的配置文件 | | /target | 编译输出目录 | | pom.xml | Maven进行工作的主要配置文件 | > 4. 编写代码 > (1)在src/main/java 目录下创建包cn.itcast.mavendemo > (2)在包cn.itcast.mavendemo下创建HelloWorld 类 ~~~ package cn.itcast.mavendemo; public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!!"); } } ~~~ ### (二)设置编译版本 > 我们现在的Maven工程默认是JDK1.5 ,我们需要将编译版本改为JDK1.7 ~~~ <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> </plugins> </build> ~~~ > 将上边的配置信息粘贴到pom.xml中。 > 点击工程右键 Maven -> Update Project ... > 弹出窗口后OK .操作后 ,编译版本改为 1.7 ![](https://box.kancloud.cn/4cee1bc4578b10a215d092893dd4b8fe_370x309.png) ### (三)添加依赖 ![](https://box.kancloud.cn/4bfa262ffadfc83ce0ccffbaa90da370_664x315.png) > https://repository.sonatype.org/ > 右键点击工程 Maven -- > Add Dependency ![](https://box.kancloud.cn/08c5817b2bbb6cfb2f07ae5c1be30e57_381x424.png) > 添加后打开pom.xml,发现多了以下信息 ~~~ <dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.0.7.Final</version> </dependency> </dependencies> ~~~ > 我们再看工程目录下的Maven Dependecies 下又多了很多jar包 ![](https://box.kancloud.cn/020ecd6290871f777888a63921705bf8_461x562.png) > 奇怪了!我只是加了一个hibernate的核心包,为什么会多出这么多jar包呢? > 这是因为hibernate的核心包本身又会依赖其它的jar包,所以导入hibernate包自动会添加hibernate所依赖的包 ### (四)项目生命周期(了解) > Maven有三套相互独立的生命周期,分别是:clean、default、site。clean主要是清理项目、default是Maven最核心的的构建项目、site是生成项目站点。每一个大的生命周期又分为很多个阶段。后面的阶段依赖于前面的阶段,这点有点像Ant的构建依赖。生命周期本身相互独立,用户可以仅仅调用生命周期的某一个阶段,也就是说用户调用了default周期的任何阶段,并不会触发clean周期以及site周期的任何事情。 > 三大生命周期蕴含着小小的阶段,我们按顺序看一下: ![](https://box.kancloud.cn/72b115a7b8da8c69571adc472d7d5425_712x418.png) #### (1)clean周期: ~~~ pre-clean:准备清理 clean:真正的清理工作 post-clean:执行清理后的一些后续工作 ~~~ #### (2)default周期: ~~~ validate:验证 initialize:初始化配置 generate-sources:生成源代码编译目录 process-sources:处理项目主资源文件,复制资源文件到outputclasspath generate-resources:生成资源目录 process-resources:处理资源文件 complie:编译源代码 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 ... ![](https://box.kancloud.cn/61275c0c79db26ff922a6a152f24b2a8_664x533.png) > 常用命令如下: ~~~ compile:编译 clean:清理,将target下的class文件清理 test: 执行单元测试类,执行src/test/java下的类 package :将java工程打成jar、war。 install:安装命令,将将程的jar发布到本地仓库 发布到仓库,目录按照本工程定义的坐标生成目录 扩展: 其实我们所执行的这些命令是对maven原生命令的封装,我们可以在命令提示符下直接通过这些命令来对代码进行编译打包等操作,格式如下: mvn 命令名称 运行不调试 mvnDebug 命令名称 调试运行 我们要在命令提示符下执行maven命令必须配置下面两个环境变量 MAVEN_HOME D:\apache-maven-3.3.9 PATH %MAVEN_HOME%\bin ~~~ > 测试Maven环境 ,在控制台输入mvn -v ,有下列信息输出表示Maven配置正常。 ![](https://box.kancloud.cn/b3ae0bd00275fad03b9da44216d5e037_770x162.png) ## 四、创建SSH2工程(重点) > 需求,用SSH2集成框架搭建工程mavenweb ,功能为单表的列表查询。 > 表名称 dep (部门表) ![](https://box.kancloud.cn/6155d1fce058db81197aeae3eade1cd1_799x255.png) ### (一)创建war工程 #### 1. 选择菜单 File ->new -> Other ![](https://box.kancloud.cn/751d7b330dd038c049246272a22891e9_578x543.png) > 选择Maven下的Maven Project, next #### 2. 选中下图红框部分的复选框(跳过骨架),next ![](https://box.kancloud.cn/cc22daab9320d478dd4e112d794fcb72_587x441.png) #### 3. 定义工程坐标 ![](https://box.kancloud.cn/b5fcc7d512dce21e3b98d4ef801d7331_618x556.png) > 注意打包方式选择war工程。 #### 4. 手动添加web.xml > (1)在src /main/webapp 目录下手动创建WEB-INF目录 > (2)将资源文件夹下的web.xml拷贝至WEB-INF目录 ![](https://box.kancloud.cn/d93348644ed64335f333aebbcf5e3e0a_289x227.png) #### 5. 添加插件 > 将下列配置拷贝至pom.xml ~~~ <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <configuration> <!-- 指定端口 --> <port>8080</port> <!-- 请求路径 --> <path>/</path> </configuration> </plugin> </plugins> </build> ~~~ > 点击工程右键 Maven -> Update Project ... #### 6. 在pom.xml中添加servlet-api > 因为我们创建的是war工程 ,需要response 和request 等对象,而这些对象是在servlet-api中的,所以我们需要添加servlet-api ,才能保证工程正常编译。 > 注意:必须指定scope为provided , 这是设置依赖范围,我们后边的章节会详细讲解。如果设置则启动会报错。 ~~~ <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> </dependencies> ~~~ > 添加后更新工程 #### 7. 创建index.jsp ~~~ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>测试页面</title> </head> <body> 开启神秘的Maven世界~ </body> </html> ~~~ > 部署运行测试 执行命令 > tomcat7:run > 用浏览器测试,地址: http://localhost:8080/index.jsp ### (二)添加SSH依赖 > SSH2框架需要添加的依赖如下: ~~~ <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.0.7.Final</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.7</version> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.24</version> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.3.24</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> ~~~ ### (三)SSH工程搭建 #### 1. 建立包结构 ![](https://box.kancloud.cn/e726a0d017cbee1aee0d084fbcadef9d_403x255.png) #### 2. 添加spring配置文件 > 拷贝资源下的配置文件文件夹中的applicationContext.xml #### 3. 添加struts配置文件 ~~~ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="default" namespace="/" extends="struts-default"> </package> </struts> ~~~ #### 4. 修改web.xml 配置文件,添加以下配置 ~~~ <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:applicationContext.xml</param-value> </context-param> <filter> <filter-name>openSessionInView</filter-name> <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>openSessionInView</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 5. 编写实体类 package cn.itcast.mavenweb.domain; /** * 部门 * @author Administrator * */ public class Dep { private Long uuid; private String name; private String tele; public Long getUuid() { return uuid; } public void setUuid(Long uuid) { this.uuid = uuid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getTele() { return tele; } public void setTele(String tele) { this.tele = tele; } } ~~~ #### 6. 编写映射文件 > 在src/main/resources 下创建包cn.itcat.mavenweb.domain ![](https://box.kancloud.cn/a38baef1eb46e84fb361ff05724fb50c_363x143.png) ## 九、私服nexus ### (一)nexus安装 #### 1. 安装nexus > 将资源下的私服文件夹中的nexus-2.12.0-01-bundle.zip 解压 ![](https://box.kancloud.cn/2aefcf10c2e7af549c696034bc4cf1f3_773x238.png) > 在命令提示符下,进入此目录,敲入命令 ~~~ nexus install ~~~ > 如有下列提示则证明安装成功。 ![](https://box.kancloud.cn/e634d711d86a37fde5c09b68f42a7f70_770x193.png) > 如果想卸载,命令为: ~~~ nexus uninstall ~~~ #### 2. 启动nexus > 在服务中找到nexus ,右键启动 ![](https://box.kancloud.cn/209399da1e3ad59954a1351e3f25ca66_774x312.png) #### 3. 进入nexus > 打开浏览器输入地址:http://localhost:8081/nexus ![](https://box.kancloud.cn/f961a568b7e687e49c2fa2013c89161c_588x314.png) > 点击右上角的Log In ,在弹出窗口中输入username为admin , password为admin123 ,点击Log In按钮 ![](https://box.kancloud.cn/87c7fa6f7735fc3db13e754e5aeab8be_621x328.png) ### (二)构建索引 > 刚刚安装好的nexus是无法直接搜索到jar包的,必须下载索引才可以正常使用。 > 我们到中央仓库地址 http://repo.maven.apache.org/maven2/.index/ 下载以下两个索引压缩文件 > nexus-maven-repository-index.gz > nexus-maven-repository-index.properties > 这两个文件一般在此页面的最后的位置,另外还需要在网上下载一个名为indexer-cli-5.1.1.jar 的jar包 > 将以下三个文件放入一个文件夹 ![](https://box.kancloud.cn/edef5156197e95239b37290be8346f65_364x190.png) > cmd执行: ~~~ java -jar indexer-cli-5.1.1.jar -u nexus-maven-repository-index.gz -d indexer ~~~ > 执行后生成目录indexer,目录下的文件是索引文件,如下图 ![](https://box.kancloud.cn/da818c26a06ed0025a0d54e6d9cc6cf8_777x87.png) > 将D:\nexus-2.12.0-01-bundle\sonatype-work\nexus\indexer\central-ctx 目录下的文件删除,将上边的索引文件拷贝到此目录下。 > 拷贝后重新启动nexus,然后进入nexus搜索jar包发现可以进行搜索了。 ![](https://box.kancloud.cn/cba2313ef502a830c21d5fe0c1528789_780x323.png) ### (三)仓库类型 ![](https://box.kancloud.cn/d4a8c41d123dbbf3a34963b998c5a29c_315x334.png) 1. hosted:宿主仓库,自己项目的jar要放到hosted类型的仓库中。 2. proxy:代理仓库,代理中央仓库 3. virtual:虚拟仓库,存储了maven1的构件,一般不用。 4. group:仓库组,将一些仓库组成一个组,自己项目连接仓库组去下载jar包。 > 平常开发中都去连接仓库组,仓库组中包括:hosted、proxy等。 > 仓库所在的文件夹见下面的截图: ![](https://box.kancloud.cn/2418926fb2e29808d340a1857caf6fc7_777x242.png) ### (四)镜像配置 > nexus已经安装好了,我们要开始使用它了。现在我们需要在maven的配置文件settings.xml中配置镜像,让maven找私服,而不是直接到中央仓库下载。 > 打开maven的配置文件settings.xml,添加如下配置: ~~~ <mirrors> <mirror> <id>nexus</id> <mirrorOf>*</mirrorOf> <url>http://localhost:8081/nexus/content/groups/public/</url> </mirror> </mirrors> ~~~ > mirrors为镜像组,可以配置多个mirror(镜像),我们这里配置的是nexus中的中央代理仓库。 > 配置好后,我们需要创建一个项目来测试一下,看看是不是可以通过nexus来下载jar包。 > 测试步骤: > 创建maven工程(jar),在pom.xml中添加依赖,观察nexus中是否下载了相应的jar包,目录为 nexus-2.12.0-01-bundle\sonatype-work\nexus\storage\central ### (五)发布自己的工程jar到nexus #### 1. 创建maven工程itcastutil (jar) > 坐标信息: Group Id : cn.itcast.util > Artifact Id: itcastutil > 创建包cn.itcast.util > 创建类DateUtil > package cn.itcast.util; ~~~ import java.util.Calendar; import java.util.Date; /** * 日期工具类 * @author Administrator * */ public class DateUtil { /** * 获取当前年份 * @return */ public static int getYear(){ Calendar calendar=Calendar.getInstance(); calendar.setTime(new Date()); return calendar.get(Calendar.YEAR); } } ~~~ > 在pom.xml中引入如下配置信息 ~~~ <distributionManagement> <repository> <id>releases</id> <url> http://localhost:8081/nexus/content/repositories/releases/ </url> </repository> <snapshotRepository> <id>snapshots</id> <url> http://localhost:8081/nexus/content/repositories/snapshots/ </url> </snapshotRepository> </distributionManagement> ~~~ #### 2. 在Maven中配置 > 将以下配置信息放入maven的settings.xml中 ~~~ <servers> <server> <id>releases</id> <username>admin</username> <password>admin123</password> </server> <server> <id>snapshots</id> <username>admin</username> <password>admin123</password> </server> </servers> ~~~ > 注意:settings.xml 配置 <id>和 pom.xml<id> 对应! > 然后执行命令 deploy ,有如下提示表示部署成功 ![](https://box.kancloud.cn/efb471c3ff28cff8db246d1f9ec66b31_774x210.png) > 我们在私服中进行查询,发现可以查到刚才我们上传的jar ![](https://box.kancloud.cn/df98249d4664eee13f286568a62ef839_772x98.png) ### (六)发布第三方的工程jar到nexus > 有很多jar包由于版权等问题,并不会出现在中央仓库中,比如oracle的驱动,那如何将这类jar包放在nexus中呢?我们看下列操作步骤: > (1)选择左侧菜单的Repositories, 在Repositories窗口中选择3rd party ![](https://box.kancloud.cn/e2d4ba5f77d5a4c57ad556e683d2117b_772x255.png) > (2)在3rd party窗口中选择Artifact Upload ![](https://box.kancloud.cn/3c1c8d651e0dc8485013a2a1c065b115_778x272.png) > (3)在Artifact Upload选项卡中填写坐标,并上传jar包。 ![](https://box.kancloud.cn/329a470781fa324bb87dafece8788c53_466x314.png) > 上传jar包选择oracle的驱动。 ![](https://box.kancloud.cn/102d7981ac513996e5e4a39fbe72b314_772x197.png) > 填写坐标 ![](https://box.kancloud.cn/884b167a3f227327356d029c3f050e94_751x239.png) > 有下列提示则为上传成功 ![](https://box.kancloud.cn/079d0c2b846748ff3286c01ce2af0b67_381x141.png) > 上传成功后可以在3rd party库中找到此jar包 ![](https://box.kancloud.cn/dde1fff8a747c69e0523a6bc9d3403be_775x317.png)