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 不是那么了解,所以就有了这个想法.这 ...
随机推荐
- django - 总结 - cnblog 知识点
1.图像预览 点击头像------>点击input img和input重合; img在label,input-->display:none $("#avatar").c ...
- SpringBoot系列: Pebble模板引擎
===============================Java 模板引擎选择===============================SpringBoot Starter项目向导中可选的J ...
- [数分提高]2014-2015-2第6教学周第1次课讲义 3.3 Taylor 公式
1. (Taylor 公式). 设 $f^{(n)}$ 在 $[a,b]$ 上连续, $f^{(n+1)}$ 在 $(a,b)$ 内存在, 试证: $ \forall\ x,x_0\in [a,b], ...
- Javaweb学习笔记——(二十三)——————AJAX、XStream、JSON
AJAX概述 1.什么是AJAX ajax(Asynchronous JavaScript and xml) 翻译成中文就是"异步JavaScript和xml&quo ...
- CF1139C Edgy Trees
题目地址:CF1139C Edgy Trees 红黑树 \(ans\) 应该等于总数(\(n^k\))减去不含黑色边的序列数量 不含黑色边就意味着一个序列只能在一个红色联通块中 一个红色联通块中的序列 ...
- 题解-HNOI2017 抛硬币
Problem loj2023 题意概述:甲抛掷 \(a\) 次硬币,乙抛掷 \(b\) 次硬币,问有多少种情况甲正面向上的次数比乙多,答案对 \(10^k\) 取模 对于 \(10\%\) 的数据, ...
- 【原创】大叔经验分享(26)hive通过外部表读写elasticsearch数据
hive通过外部表读写elasticsearch数据,和读写hbase数据差不多,差别是需要下载elasticsearch-hadoop-hive-6.6.2.jar,然后使用其中的EsStorage ...
- Jquery点击div之外的地方隐藏当前div
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script sr ...
- asp.net core 通过ajax调用后台方法(非api)
1. 在Startup.cs文件中添加: services.AddMvc(); services.AddAntiforgery(o => o.Heade ...
- poj3126 Prime Path 广搜bfs
题目: The ministers of the cabinet were quite upset by the message from the Chief of Security stating ...