[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 管理項目生命周期過程都是基于插件完成的

### (二)Maven倉庫

#### 1、中央倉庫
> 就是遠程倉庫,倉庫中jar由專業團隊(maven團隊)統一維護。
> 中央倉庫的地址:http://repo1.maven.org/maven2/
#### 2、本地倉庫
> 相當于緩存,工程第一次會從遠程倉庫(互聯網)去下載jar 包,將jar包存在本地倉庫(在程序員的電腦上)。第二次不需要從遠程倉庫去下載。先從本地倉庫找,如果找不到才會去遠程倉庫找。
#### 3、私服
> 在公司內部架設一臺私服,其它公司架設一臺倉庫,對外公開。
## 二、Maven環境搭建
### (一)Maven下載
> 可以到maven的官網下載
> http://maven.apache.org/download.cgi

> 我們將下載的壓縮包解壓到D盤根目錄,D盤根目錄會有下面的文件夾

### (二)本地倉庫配置
#### 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 , 在左側的樹狀導航中

> 點擊add按鈕,彈出窗口后選擇maven的安裝目錄

> 然后點擊Apply

#### 2. 配置User Settings

> 選擇左側樹形導航的User Settings ,選擇Maven目錄下conf下的settingsxml
> 然后點擊Update Settings 、Reindex 和Apply按鈕.
### (四)重建本地倉庫索引
> 選擇菜單 window --> show View

> 選擇 Rebuild Index 重新創建索引
## 三、Maven入門
### (一)創建工程
> 1. 選擇菜單 File ->new -> Other

> 選擇Maven下的Maven Project, Next
> 2. 選中下圖紅框部分的復選框(跳過骨架),next

> 3. 定義工程坐標
> maven對所有工程管理基于坐標進行管理

> 坐標包括:
~~~
Group Id:項目的名稱,項目名稱以域名的倒序,比如:cn.itcast.mavendemo
Artifact Id:模塊名稱(子項目名稱)
Version:模塊的版本,snapshot(快照版,沒有正式發行)、release(正式發行版本)
輸入后,Finish 。完成后如下圖
~~~

> 工程目錄結構說明:
> 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://repository.sonatype.org/
> 右鍵點擊工程 Maven -- > Add Dependency

> 添加后打開pom.xml,發現多了以下信息
~~~
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.0.7.Final</version>
</dependency>
</dependencies>
~~~
> 我們再看工程目錄下的Maven Dependecies 下又多了很多jar包

> 奇怪了!我只是加了一個hibernate的核心包,為什么會多出這么多jar包呢?
> 這是因為hibernate的核心包本身又會依賴其它的jar包,所以導入hibernate包自動會添加hibernate所依賴的包
### (四)項目生命周期(了解)
> Maven有三套相互獨立的生命周期,分別是:clean、default、site。clean主要是清理項目、default是Maven最核心的的構建項目、site是生成項目站點。每一個大的生命周期又分為很多個階段。后面的階段依賴于前面的階段,這點有點像Ant的構建依賴。生命周期本身相互獨立,用戶可以僅僅調用生命周期的某一個階段,也就是說用戶調用了default周期的任何階段,并不會觸發clean周期以及site周期的任何事情。
> 三大生命周期蘊含著小小的階段,我們按順序看一下:

#### (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 ...

> 常用命令如下:
~~~
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配置正常。

## 四、創建SSH2工程(重點)
> 需求,用SSH2集成框架搭建工程mavenweb ,功能為單表的列表查詢。
> 表名稱 dep (部門表)

### (一)創建war工程
#### 1. 選擇菜單 File ->new -> Other

> 選擇Maven下的Maven Project, next
#### 2. 選中下圖紅框部分的復選框(跳過骨架),next

#### 3. 定義工程坐標

> 注意打包方式選擇war工程。
#### 4. 手動添加web.xml
> (1)在src /main/webapp 目錄下手動創建WEB-INF目錄
> (2)將資源文件夾下的web.xml拷貝至WEB-INF目錄

#### 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. 建立包結構

#### 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

## 九、私服nexus
### (一)nexus安裝
#### 1. 安裝nexus
> 將資源下的私服文件夾中的nexus-2.12.0-01-bundle.zip 解壓

> 在命令提示符下,進入此目錄,敲入命令
~~~
nexus install
~~~
> 如有下列提示則證明安裝成功。

> 如果想卸載,命令為:
~~~
nexus uninstall
~~~
#### 2. 啟動nexus
> 在服務中找到nexus ,右鍵啟動

#### 3. 進入nexus
> 打開瀏覽器輸入地址:http://localhost:8081/nexus

> 點擊右上角的Log In ,在彈出窗口中輸入username為admin , password為admin123 ,點擊Log In按鈕

### (二)構建索引
> 剛剛安裝好的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包
> 將以下三個文件放入一個文件夾

> cmd執行:
~~~
java -jar indexer-cli-5.1.1.jar -u nexus-maven-repository-index.gz -d indexer
~~~
> 執行后生成目錄indexer,目錄下的文件是索引文件,如下圖

> 將D:\nexus-2.12.0-01-bundle\sonatype-work\nexus\indexer\central-ctx 目錄下的文件刪除,將上邊的索引文件拷貝到此目錄下。
> 拷貝后重新啟動nexus,然后進入nexus搜索jar包發現可以進行搜索了。

### (三)倉庫類型

1. hosted:宿主倉庫,自己項目的jar要放到hosted類型的倉庫中。
2. proxy:代理倉庫,代理中央倉庫
3. virtual:虛擬倉庫,存儲了maven1的構件,一般不用。
4. group:倉庫組,將一些倉庫組成一個組,自己項目連接倉庫組去下載jar包。
> 平常開發中都去連接倉庫組,倉庫組中包括:hosted、proxy等。
> 倉庫所在的文件夾見下面的截圖:

### (四)鏡像配置
> 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 ,有如下提示表示部署成功

> 我們在私服中進行查詢,發現可以查到剛才我們上傳的jar

### (六)發布第三方的工程jar到nexus
> 有很多jar包由于版權等問題,并不會出現在中央倉庫中,比如oracle的驅動,那如何將這類jar包放在nexus中呢?我們看下列操作步驟:
> (1)選擇左側菜單的Repositories, 在Repositories窗口中選擇3rd party

> (2)在3rd party窗口中選擇Artifact Upload

> (3)在Artifact Upload選項卡中填寫坐標,并上傳jar包。

> 上傳jar包選擇oracle的驅動。

> 填寫坐標

> 有下列提示則為上傳成功

> 上傳成功后可以在3rd party庫中找到此jar包

- hadoop
- linux基礎
- Linux入門
- Linux進階
- shell
- Zookeeper
- Zookeeper簡介及部署
- Zookeeper使用及API
- Redis
- Redis簡介安裝部署
- Redis使用及API
- Java高級增強
- Java多線程增強
- Maven簡介及搭建
- Hive
- Hive簡介及安裝
- Hive操作
- HIve常用函數
- Hive數據類型
- Flume
- Flume簡介及安裝
- flume 攔截器(interceptor)
- azkaban
- azKaban簡介及安裝
- Sqoop
- Sqoop簡介及安裝
- HDFS
- HDFS原理
- HDFS操作API
- MAPREDUCE原理
- MAPREDUCE圖片資源
- MAPREDUCE加強
- HBASE
- HBASE簡介及安裝
- HBASE操作及API
- HBASE內部原理
- Storm
- Storm簡介及安裝
- Storm原理
- kafka
- kafka簡介及安裝
- kafka常用操作及API
- kafka原理
- kafka配置詳解
- Scala
- Scala簡介及安裝
- Scala基礎語法
- Scala實戰