maven使用教程

一、Maven是什么

Maven是一个Apache组织的开源项目,是用来构建项目和管理依赖的工具。Maven基于项目对象模型(POM project object model),通过一小段描述信息(配置/坐标)来管理项目的构建,报告和文档。

  • 依赖管理:对项目需要使用到的jar包进行管理。
  • 项目构建:项目在编码完成后,对项目进行编译、测试、打包(war)、部署。

二、Maven的优势

  1. 使用Maven管理的Java 项目都有着相同的项目结构
    a. 有一个pom.xml 用于维护当前项目都用了那些jar包
    b. 所有的java代码都放在 src/main/java
    c. 所有的测试代码都放在src/test/java

  2. 借助maven可以以规范的方式下载jar包
    如果jar包在各个官网网站下载,会浪费很多时间,而且可能功能不全。借助maven可以以规范的方式下载jar包,因为所有的知名框架或者第三方工具的jar包已经按照统一的规范存放到了maven的*仓库中了。

  3. 更好的管理项目依赖的jar包
    同样的jar包重复出现在不同的项目中,浪费空间,让工程变得更加臃肿。maven风格的项目,首先把所有的jar包都放在"仓库“ 里,然后哪个项目需要用到这个jar包,只需在项目中的pom.xml中要给出jar包的名称和版本号就行了,不用复制文件过来占用空间。

  4. Maven项目会自动把一个jar包所依赖的其它jar包下载下来。

  5. 在maven项目编码完成后,可以对项目进行编译、测试、打包、部署

  6. 项目非常大时,可借助Maven将一个项目拆分成多个工程,最好是一个模块对应一个工程,利于分工协作。而且模块之间还是可以发送消息的

三、仓库的概念

刚才说过在项目中通过pom.xml中的配置,就能够获取到项目所需要的jar包,但是这些jar是在哪里呢,也就是我们从哪里获取到的这些jar包?答案就是仓库。仓库分为:本地仓库、*仓库、第三方仓库(私服)。

  • 本地仓库
    Maven会将项目中依赖的Jar包从远程服务器上下载到本机一个目录下管理,每个电脑默认的仓库是在 $user.home/.m2/repository下。
    放在C盘有一点不好,重装系统就都没有了。一般我们会修改本地仓库位置,自己创建一个文件夹, 把仓库的位置修改为自己建的文件夹。
    修改本地仓库位置:在maven安装目录下/conf/setting.xml文件中修改
    maven使用教程

  • *仓库
    Maven内置了远程公用仓库:http://repo1.maven.org/maven2
    这个公共仓库是由Maven自己维护,里面有大量的常用类库,并包含了世界上大部分流行的开源项目jar包。目前是以java为主工程。项目依赖的jar包如果本地仓库没有,默认从*仓库下载。

  • 第三方仓库(私服)
    第三方仓库,又称为内部中心仓库,也称为私服。一般是由公司自己设立的,只为本公司内部共享使用。使用私服可以减少在外部访问和下载的频率(使用私服为了减少对*仓库的访问),私服可以使用局域网,*仓库必须使用外网。一般公司都会创建这种第三方仓库,保证项目开发时,项目所需用的jar都从该仓库中拿,每个人的版本就都一样。
    注意:连接私服,需要单独配置。如果没有配置私服,默认不使用

从maven仓库获取jar包的过程
maven使用教程
注意事项

maven 会默认从maven官方提供的服务器下载jar包。 
而官方服务器在国外,因为大家都知道的原因,网速很慢,而且容易卡断。 为了便于快速下载相关jar包,可以使用国内maven 阿里云的下载地址:使用阿里云下载路径。
打开maven安装目录下conf/setting.xml
修改在mirrors下新加一个阿里云的镜像地址:
<mirror>
	<id>alimaven</id>
	<name>aliyun maven</name>
	<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
	<mirrorOf>central</mirrorOf>
</mirror> 

四、Maven的安装与配置

  1. Maven 是一个基于 Java 的工具,所以要做的第一件事情就是安装 JDK。
    系统要求:
项目 要求
JDK Maven 3.3 要求 JDK 1.7 或以上 Maven 3.2 要求 JDK 1.6 或以上 Maven 3.0/3.1 要求 JDK 1.5 或以上
内存 没有最低要求
磁盘 Maven 自身安装需要大约 10 MB 空间。除此之外,额外的磁盘空间将用于你的本地 Maven 仓库。你本地仓库的大小取决于使用情况,但预期至少 500 MB
操作系统 没有最低要求
  1. Maven 下载
    Maven下载地址:http://maven.apache.org/download.cgi
    maven使用教程
    下载完之后解压到自己电脑上没有空格没有中文的文件夹里即可

  2. 配置环境变量
    右键 “计算机”,选择 “属性”,之后点击 “高级系统设置”,点击"环境变量",来设置环境变量,有以下系统变量需要配置:
    新建系统变量 MAVEN_HOME,变量值:D:\soft\apache-maven-3.5.4
    maven使用教程
    编辑系统变量 Path,添加变量值:;%MAVEN_HOME%\bin
    maven使用教程

4.检验配置是否成功:用win键+R,来打开命令行提示符窗口,即Dos界面,输入mvn –version 若出现以下情况说明配置成功
maven使用教程

五、使用Maven创建项目

Maven作为一种工具,可以创建标准化的Maven风格Java项目。 但是在实际工作中,很少有机会直接通过Maven 命令行来做到这一点。 通常都是在Eclipse或者IDEA中,通过集成Maven的方式来创建Java 项目。

六、Eclipse配置Maven

Eclipse已经支持MAVEN的了,无需额外手动集成。
步骤1 : 设置MAVEN路径
菜单->Window->Preferences->Maven->Installations-> 指定maven的安装目录
maven使用教程
步骤 2 : 设置仓库路径
菜单->Window->Preferences->Maven->User Settings->
Global Settings 和 User Settings都使用:
maven使用教程

七、在Eclipse中创建Maven项目

  • 创建maven java桌面项目

    • 第一步:选择菜单创建Maven项目
      maven使用教程

    • 第二步:选择项目目录结构的骨架
      maven使用教程

    • 第三步:输入项目相关信息
      maven使用教程

    • 第四步:Maven桌面项目的目录结构
      maven使用教程
      备注:因为这个步骤必须连接到Maven服务器获取相关信息, 如果配置和网络有故障则这个步骤就会出现错误!
      如果出现错误请使用浏览器检测是否能够访问Maven服务器的URL.

  • 创建Maven Web项目

    • 第一步:选择菜单创建Maven项目
      maven使用教程
    • 第二步:选择项目目录结构的骨架
      maven使用教程
    • 第三步:输入项目相关信息
      maven使用教程
    • 第四步:Maven war项目的目录结构
      maven使用教程
      备注:因为这个步骤必须连接到Maven服务器获取相关信息, 如果配置和网络有故障则这个步骤就会出现错误!
      如果出现错误请使用浏览器检测是否能够访问Maven服务器的URL.
    • 第五步:创建Web部署描述文件web.xml消除检测错误
      maven使用教程

八、使用maven搭建SSH项目

在项目pom.xml配置项目SSH框架所需jar包的maven依赖如下:

<properties>
		<spring.version>4.1.7.RELEASE</spring.version>
		<hibernate.version>3.6.9.Final</hibernate.version>
</properties>
	
	<!-- 配置项目依赖的jar包 -->
	<dependencies>
		<!-- spring配置 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>${spring.version}</version>
		</dependency>
		
		<!-- SpringAOP需要依赖这个jar包 -->
		<dependency>
		    <groupId>org.aspectj</groupId>
		    <artifactId>aspectjweaver</artifactId>
		    <version>1.8.13</version>
		</dependency>
		
		<!-- SpringMVC文件上传时依赖这个jar包 -->
		<dependency>
		    <groupId>commons-fileupload</groupId>
		    <artifactId>commons-fileupload</artifactId>
		    <version>1.4</version>
		</dependency>
				
	
		<!-- hibernate 配置  -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>${hibernate.version}</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-entitymanager</artifactId>
			<version>${hibernate.version}</version>
		</dependency>
	
		<!-- mysql数据库的驱动包 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.6</version>
		</dependency>
	
		<!-- 引入jstl包 -->
		<dependency>
			<groupId>javax.servlet.jsp.jstl</groupId>
			<artifactId>jstl-api</artifactId>
			<version>1.2</version>
			<exclusions>
				<exclusion>
					 <groupId>javax.servlet</groupId>
    				<artifactId>servlet-api</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
		    <groupId>taglibs</groupId>
		    <artifactId>standard</artifactId>
		    <version>1.1.2</version>
		</dependency>
	
		<!-- 引入servlet -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
		</dependency>

		<!-- 引入Jackson相关依赖 -->
		<dependency>
		  <groupId>com.fasterxml.jackson.core</groupId>
		  <artifactId>jackson-core</artifactId>
		  <version>2.8.1</version>
		</dependency>
		<dependency>
		  <groupId>com.fasterxml.jackson.core</groupId>
		  <artifactId>jackson-databind</artifactId>
		  <version>2.8.1</version>
		</dependency>
		<dependency>
		  <groupId>com.fasterxml.jackson.core</groupId>
		  <artifactId>jackson-annotations</artifactId>
		  <version>2.8.1</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
		<dependency>
		    <groupId>org.apache.commons</groupId>
		    <artifactId>commons-lang3</artifactId>
		    <version>3.7</version>
		</dependency>
				
	</dependencies>

九、setting.xml和pom.xml

从settings.xml的文件名就可以看出,它是用来设置maven参数的配置文件。并且,settings.xml是maven的全局配置文件。Settings.xml中包含类似本地仓库位置、修改远程仓库服务器、认证信息等配置。而pom.xml主要描述了项目的maven坐标,依赖关系以及其他所有的项目相关因素,是项目级别的配置文件。

Pom文件简解:

<project
xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
	<!-- 模型版本。maven2.0必须是这样写,现在是maven2唯一支持的版本 -->
	<modelVersion>4.0.0</modelVersion>
 
	<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.winner.trade,maven会将该项目打成的jar包放本地路径:/com/winner/trade -->
	<groupId>com.winner.trade</groupId>
 
	<!-- 本项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
	<artifactId>trade-core</artifactId>
 
	<!-- 本项目目前所处的版本号 -->
	<version>1.0.0-SNAPSHOT</version>
 
	<!-- 打包的机制,如pom,jar, maven-plugin, ejb, war, ear, rar, par,默认为jar -->
	<packaging>jar</packaging>
 
	<!-- 帮助定义构件输出的一些附属构件,附属构件与主构件对应,有时候需要加上classifier才能唯一的确定该构件 不能直接定义项目的classifer,因为附属构件不是项目直接默认生成的,而是由附加的插件帮助生成的 -->
	<classifier>...</classifier>

	<!-- 定义本项目的依赖关系 -->
	<dependencies>
		<!-- 每个dependency都对应这一个jar包 -->
		<dependency>
 
			<!--一般情况下,maven是通过groupId、artifactId、version这三个元素值(俗称坐标)来检索该构件, 然后引入你的工程。如果别人想引用你现在开发的这个项目(前提是已开发完毕并发布到了远程仓库),--> 
			<!--就需要在他的pom文件中新建一个dependency节点,将本项目的groupId、artifactId、version写入, maven就会把你上传的jar包下载到他的本地 -->
			<groupId>com.winner.trade</groupId>
			<artifactId>trade-test</artifactId>
			<version>1.0.0-SNAPSHOT</version>
 
			<!-- maven认为,程序对外部的依赖会随着程序的所处阶段和应用场景而变化,所以maven中的依赖关系有作用域(scope)的限制。 -->
			<!--scope包含如下的取值:compile(编译范围)、provided(已提供范围)、runtime(运行时范围)、test(测试范围)、system(系统范围) -->
			<scope>test</scope>
 
			<!-- 设置指依赖是否可选,默认为false,即子项目默认都继承:为true,则子项目必需显示的引入,与dependencyManagement里定义的依赖类似  -->
			<optional>false</optional>
 
			<!-- 屏蔽依赖关系。 比如项目中使用的libA依赖某个库的1.0版,libB依赖某个库的2.0版,现在想统一使用2.0版,就应该屏蔽掉对1.0版的依赖 -->
			<exclusions>
				<exclusion>
					<groupId>org.slf4j</groupId>
					<artifactId>slf4j-api</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>
 
	<!-- 为pom定义一些常量,在pom中的其它地方可以直接引用 使用方式 如下 :${file.encoding} -->
	<properties>
		<file.encoding>UTF-8</file.encoding>
		<java.source.version>1.5</java.source.version>
		<java.target.version>1.5</java.target.version>
	</properties>
</project>

十、Maven常用命令

  1. mvn package 打包
  2. mvn clean 清空产生的项目( target里)
  3. mvn compile 编译源代码
  4. mvn test 运行测试
  5. mvn -Dtest package 只打包不测试
  6. mvn install 在本地repository中安装jar(包含mvn compile,mvn package,然后上传到本地仓库)
  7. mvn site 产生site
  8. mvn deploy 上传到私服(包含mvn install,然后,上传到私服)
  9. mvn test-compile 编译测试代码
  10. mvn jar:jar 只打jar包
  11. mvn test -skipping compile -skipping test-compile 只测试而不编译,也不测试编译
  12. mvn deploy
  13. mvn source.jar 源码打包
上一篇:‘mvn‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。


下一篇:Maven笔记(更新中)