maven入门概念及使用
Maven
一、Maven概念
1.maven是什么:Maven 是一个项目管理工具。它负责管理项目开发过程中的几乎所有的东西。
版本、构建、输出物管理、依赖关系、文档和构建结果、项目关系、移植性管理
2.Maven的生命周期:maven把项目的构建划分为不同的生命周期(lifecycle)。粗略一点的话,它这个过程(phase)包括:编译、测试、打包、集成测试、验证、部署。maven中所有的执行动作(goal)都需要指明自己在这个过程中的执行位置,然后maven执行的时候,就依照过程的发展依次调用这些goal进行各种处理。
3.Maven的标准工程结构
MavenProjectRoot(项目根目录)
|----src
| |----main
| |
|----java ——存放项目的.java文件
| |
|----resources ——存放项目资源文件,如spring,
hibernate配置文件
| |----test
| |
|----java ——存放所有测试.java文件,如JUnit测试类
| |
|----resources ——存放项目资源文件,如spring,
hibernate配置文件
|----target ——项目输出位置
|----pom.xml ----用于标识该项目是一个Maven项目
4.Maven的版本规范:
maven使用如下几个要素来唯一定位某一个输出物:
groudId
团体、组织的标识符。团体标识的约定是,它以创建这个项目的组织名称的逆向域名(reverse domain name)开头。一般对应着JAVA的包的结构。例如org.apache
artifactId
单独项目的唯一标识符。比如我们的tomcat, commons等。不要在artifactId中包含点号(.)。
version
一个项目的特定版本。
packaging
项目的类型,默认是jar,描述了项目打包后的输出。类型为jar的项目产生一个JAR文件,类型为war的项目产生一个web应用。
5.maven仓库与本地仓储配置:
根据Maven坐标定义每个构建在仓库中唯一存储路径,大致为:groupId/artifactId/version/artifactId-version.packaging。
分类:本地仓库(每个用户只有一个本地仓库,默认是在~/.m2/repository/,~代表的是用户目录),
远程仓库(中央仓库:http://search.maven.org/、私服)

从Maven中心仓库下载到本地的jar包的默认存放在”${user.home}/.m2/repository”中,${user.home}表示当前登录系统的用户目录(如"C:\Users\gacl")
自定义jar包存放位置(本地仓库):E盘创建文件加”repository”,修改apache-maven-2.2.3\conf目录下的settings.xml文件,添加
<localRepository>E:/repository</localRepository>
6.使用Maven编译 —— 清理 —— 测试 —— 打包 —— 安装
使用Maven编译项目,编译项目的命令是:"mvn compile"
使用Maven清理项目,清理项目的命令是:"mvn clean"
使用Maven测试项目,测试项目的命令是:"mvn test"
使用Maven打包项目,打包项目的命令是:"mvn package"
使用Maven部署项目,部署项目的命令是:"mvn install"
8.依赖管理:
依赖范围:依赖范围scope用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下:
1.compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
2.test:测试依赖范围。只对于测试classpath有效
2.provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
3.runtime:运行时提供。例如:jdbc驱动
依赖传递:MakeFriends.jar直接依赖于HelloFriends.jar,而HelloFriends.jar又直接依赖于Hello.jar,那么MakeFriends.jar也依赖于Hello.jar,这就是传递性依赖,只不过这种依赖是间接依赖,如下图所示:

9.聚合继承
聚合主要为了快速构建项目,继承主要为了消除重复。如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合。
聚合配置代码:
<modules>
<module>模块一</module>
<module>模块二</module>
<module>模块三</module>
</modules>
继承配置代码:
<parent>
<groupId>me.gacl.maven</groupId>
<artifactId>ParentProject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../ParentProject/pom.xml</relativePath>
</parent>
其中父模块用dependencyManagement管理依赖。
PS:dependencyManagement是表示依赖jar包的声明,即你在项目中的dependencyManagement下声明了依赖,maven不会加载该依赖,dependencyManagement声明可以被继承。
dependencyManagement的一个使用案例是当有父子项目的时候,父项目中可以利用dependencyManagement声明子项目中需要用到的依赖jar包,之后,当某个或者某几个子项目需要加载该插件的时候,就可以在子项目中dependencies节点只配置 groupId 和 artifactId就可以完成插件的引用。
dependencyManagement主要是为了统一管理插件,确保所有子项目使用的插件版本保持一致,类似的还是plugins和pluginManagement。
二、使用maven创建项目
2.1 maven创建Java项目
2.1.1 创建
1、使用mvn archetype:generate命令,如下所示:
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=myapp -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
2、使用mvn archetype:create命令,如下所示:
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=myapp -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
2.1.2 pom文件
1)pom意思就是project object model。
2)pom.xml包含了项目构建的信息,包括项目的信息、项目的依赖等。
3)pom.xml文件是可以继承的,大型项目中,子模块的pom.xml一般都会继承于父模块的pom.xml
2.1.3使用maven编译-清理-测试-打包-安装项目
切换到项目目录,执行mvn clean compile / mvn clean test / mvn clean package / mvn clean install 命令分别执行。
构建成功,就会将项目的jar包安装到本地仓库。
运行jar包:进入命令行,切换到myapp目录,执行命令:
java -cp target\myapp-1.0-SNAPSHOT.jar com.mycompany.app.App
运行项目APP的jar包
2.2 maven创建JavaWeb项目
2.2.1 构建
1、使用mvn archetype:generate命令,如下所示:
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-WebApp -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
2、使用mvn archetype:create命令,如下所示:
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=myWebApp -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
2.3 创建多模块项目
在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分层开发,最常见的就是分为domain(域模型层)、dao(数据库访问层)、service(业务逻辑层)、web(表现层),这样分层之后,各个层之间的职责会比较明确,后期维护起来也相对比较容易,今天我们就是使用Maven来构建以上的各个层。
项目结构如下:
system-parent
|----pom.xml
|----system-domain
|----pom.xml
|----system-dao
|----pom.xml
|----system-service
|----pom.xml
|----system-web
|----pom.xml
(1)创建system-parent项目
创建system-parent,用来给各个子模块继承。
mvn archetype:create -DgroupId=me.gacl -DartifactId=system-parent -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
将src文件夹删除,然后修改pom.xml文件,将<packaging>jar</packaging>修改为<packaging>pom</packaging>,pom表示它是一个被继承的模块,修改后的内容如下:

(2)创建sytem-domain模块
在命令行进入创建好的system-parent目录,然后执行下列命令:
mvn archetype:create -DgroupId=me.gacl -DartifactId=system-domain -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
同时,在system-parent目录中的pom.xml文件自动添加了如下内容:
<modules>
<module>system-domain</module>
</modules>
sytem-domain中pom文件为:

修改system-domain目录中的pom.xml文件,把<groupId>me.gacl</groupId>和<version>1.0-SNAPSHOT</version>去掉,加上<packaging>jar</packaging>,因为groupId和version会继承system-parent中的groupId和version,packaging设置打包方式为jar
修改后:

(3)创建system-dao(类似domain)
在命令行进入创建好的system-parent目录,然后执行下列命令:
mvn archetype:create -DgroupId=me.gacl -DartifactId=system-dao -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
(4)创建system-service(类似domain)
在命令行进入创建好的system-parent目录,然后执行下列命令:
mvn archetype:create -DgroupId=me.gacl -DartifactId=system-service -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
(5)创建system-web
在命令行进入创建好的system-parent目录,然后执行下列命令:
mvn archetype:create -DgroupId=me.gacl -DartifactId=system-web -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

注意,web项目的打包方式是war。
最后,system-parent的pom文件为:

2.3 项目构建命令说明
mvn archetype:create或者mvn archetype:generate 固定写法
-DgroupId 组织标识(包名)
-DartifactId 项目名称
-DarchetypeArtifactId 指定ArchetypeId,maven-archetype-quickstart,创建一个Java Project;maven-archetype-webapp,创建一个Web Project
-DinteractiveMode 是否使用交互模式
archetype是mvn内置的一个插件,create任务可以创建一个java项目骨架,DgroupId是软件包的名称,DartifactId是项目名,DarchetypeArtifactId是可用的mvn项目骨架,目前可以使用的骨架有:
- maven-archetype-archetype
- maven-archetype-j2ee-simple
- maven-archetype-mojo
- maven-archetype-portlet
- maven-archetype-profiles (currently under development)
- maven-archetype-quickstart
- maven-archetype-simple (currently under development)
- maven-archetype-site
- maven-archetype-site-simple
- maven-archetype-webapp
每一个骨架都会建相应的目录结构和一些通用文件,最常用的是maven-archetype-quickstart和maven-archetype-webapp骨架。maven-archetype-quickstart骨架是用来创建一个Java Project,而maven-archetype-webapp骨架则是用来创建一个JavaWeb Project。
2.4 maven常用命令
|
生命周期 |
阶段描述 |
|
mvn validate |
验证项目是否正确,以及所有为了完整构建必要的信息是否可用 |
|
mvn generate-sources |
生成所有需要包含在编译过程中的源代码 |
|
mvn process-sources |
处理源代码,比如过滤一些值 |
|
mvn generate-resources |
生成所有需要包含在打包过程中的资源文件 |
|
mvn process-resources |
复制并处理资源文件至目标目录,准备打包 |
|
mvn compile |
编译项目的源代码 |
|
mvn process-classes |
后处理编译生成的文件,例如对Java类进行字节码增强(bytecode enhancement) |
|
mvn generate-test-sources |
生成所有包含在测试编译过程中的测试源码 |
|
mvn process-test-sources |
处理测试源码,比如过滤一些值 |
|
mvn generate-test-resources |
生成测试需要的资源文件 |
|
mvn process-test-resources |
复制并处理测试资源文件至测试目标目录 |
|
mvn test-compile |
编译测试源码至测试目标目录 |
|
mvn test |
使用合适的单元测试框架运行测试。这些测试应该不需要代码被打包或发布 |
|
mvn prepare-package |
在真正的打包之前,执行一些准备打包必要的操作。这通常会产生一个包的展开的处理过的版本(将会在Maven 2.1+中实现) |
|
mvn package |
将编译好的代码打包成可分发的格式,如JAR,WAR,或者EAR |
|
mvn pre-integration-test |
执行一些在集成测试运行之前需要的动作。如建立集成测试需要的环境 |
|
mvn integration-test |
如果有必要的话,处理包并发布至集成测试可以运行的环境 |
|
mvn post-integration-test |
执行一些在集成测试运行之后需要的动作。如清理集成测试环境。 |
|
mvn verify |
执行所有检查,验证包是有效的,符合质量规范 |
|
mvn install |
安装包至本地仓库,以备本地的其它项目作为依赖使用 |
|
mvn deploy |
复制最终的包至远程仓库,共享给其它开发人员和项目(通常和一次正式的发布相关) |
使用参数
-Dmaven.test.skip=true: 跳过单元测试(eg: mcn clean package -Dmaven.test.skip=true)
2.5 eclipse一次编译多个工程
在Maven中,允许一个Maven Project中有多个Maven Module
1.创建maven父工程步骤:new-->other-->选择maven project-->next-->勾选create a simple project-->next-->填写Group Id、Artifact Id、Version --> packaging选择pom-->finish。

2.创建maven子工程步骤:选中刚才创建的父工程右键-->new-->other-->选择maven module-->next-->勾选create a simple project-->填写module name(其实就是artifact id)-->next-->GAV继承父工程-->packaging选择你需要的-->finish。

3.完成,刷新父工程;如有多个子工程,继续按照第二步骤创建。

这时打开XXX中的pom.xml可以看到其中有以下标签
<modules>
<module>xxx1</module>
</modules>
选择编译XXX时,会依次对它的所有Module执行相同操作。
maven入门概念及使用的更多相关文章
- 【转】Maven 入门
[转]http://www.blogjava.net/jiangshachina/archive/2006/09/01/67080.html Maven入门--概念与实例 最近由于工作原因在研究 ...
- Maven入门详解
什么是Maven Maven,鼎鼎大名,在今天之前,我对于它一直是处于一种"只闻其名不见其人"的状态.之所以说"只闻其名",是因为Maven太有名了,它是Apa ...
- maven 入门
Apache Maven 入门篇 ( 上 ) 作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法.这 ...
- Apache Maven 入门篇 ( 上 )
作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法. 这个入门篇分上下两篇.本文着重动手,用 mav ...
- [转]Apache Maven 入门篇 ( 上 )
原文地址:Apache Maven 入门篇 ( 上 ) 作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这 ...
- [转]Apache Maven 入门篇(下)
原文地址: Apache Maven 入门篇(下) 作者:George Ma 第一篇文章大概的介绍了一下Apache Maven以及它的下载和安装,并且运行了一个简单的示例.那么在对maven有了一点 ...
- Maven入门详解以及Eclisp的集成
1.首先要安装Maven到操作系统上 Maven的下载页面:http://maven.apache.org/download.html Maven跟Tomcat很像,下载下来后直接解压在指定的目录就安 ...
- maven入门(下)
Apache Maven 入门篇(下) 作者:George Ma 第一篇文章大概的介绍了一下Apache Maven以及它的下载和安装,并且运行了一个简单的示例.那么在对maven有了一点接触后,接下 ...
- maven入门(上)
Apache Maven 入门篇 ( 上 ) 作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法.这 ...
随机推荐
- 第四节:IO、序列化和反序列化、加密解密技术
一. IO读写 这里主要包括文件的读.写.移动.复制.删除.文件夹的创建.文件夹的删除等常规操作. 注意:这里需要特别注意,对于普通的控制台程序和Web程序,将"相对路径"转换成& ...
- 下拉框 -------> 初始化数据
在Web应用程序中开发编写功能时,时常用到获取数据库中的数据并将值初始化在HTML中的标签上. 1.Form from django.forms import Form from django.for ...
- Node.js实战项目学习系列(4) node 对象(global、process进程、debug调试)
前言 在之前的课程我们学习了Node的模块化规则,接下来我们将学习下 Node的几个新特性:global ,process进程,debug调试 global 跟在浏览器中的window一样都是全局变量 ...
- [再寄小读者之数学篇](2014-09-22 distributions and square integrable functions)
Suppose that $f\in L^2$, $g\in \scrD'$, if $$\bex f=g,\mbox{ in }\scrD', \eex$$ then $f=g\in L^2$. I ...
- Hibernate 4.3.11 下问题的解决
2017.01.09 问题:hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hib ...
- dense prediction问题
dense prediction 理解:标注出图像中每个像素点的对象类别,要求不但给出具体目标的位置,还要描绘物体的边界,如图像分割.语义分割.边缘检测等等. 基于深度学习主要的做法有两种: 基于图 ...
- 2.7 if应用:猜拳游戏
应用:猜拳游戏 <1>运行效果: <2>参考代码: import random player = input('请输入:剪刀(0) 石头(1) 布(2):') player = ...
- C# Textbox 自动换行
方法1 使用textbox的AppendText方法 方法2 textBox.ScrollToCaret(); this.textBox.Focus();//获取焦点 this.textBox.Sel ...
- c#管理文件系统
using System; using System.Collections.Generic; using System.IO; using static System.Console; /*Syst ...
- 1120 机器人走方格 V3(组合数)
题目实际上是求catalan数的,Catalan[n] = C(2*n,n) / (n+1) = C(2*n,n) % mod * inv[n+1],inv[n+1]为n+1的逆元,根据费马小定理,可 ...