【Java EE 学习 82 上】【MAVEN基本安装和使用方法】
一、Maven概述
1.什么是Maven?
Maven中文意思是"行家"、"专家",它是一种跨平台的项目管理工具。
2.Maven有什么作用?
Maven能够实现基于Java平台的项目构建、依赖管理和项目信息管理。
3.什么是理想的项目构建?
高度自动化,跨平台,可重用组件,符合标准化的规范
4.什么是依赖,为什么要进行依赖管理?
自动下载,统一依赖管理,方便项目升级和修改
5.项目信息包括哪些内容?
项目名称描述、开发人员信息、开发者信息等。
Maven官方下载地址:http://maven.apache.org/download.cgi
Eclipse插件更新地址:http://www.eclipse.org/m2e/
安装过程见官方文档说明:http://maven.apache.org/install.html、http://maven.apache.org/configure.html
二、Ant比较Maven
Ant和Maven都是apache下的工程,在早些时候,Ant非常流行,像是spring框架和hibernate框架都使用了该项目管理工具进行项目的构建,但是现在到他们的官网上查看项目结构,可以看出,他们都已经使用Maven管理最新的项目了,为了实现过渡,中间曾经出现过Maven和Ant共存的情况,这样倒是方便了用户的选择,但是现在这种情况已经没有了,或者说极少出现了,现在各大公司都直接使用Maven管理项目而抛弃了Ant。
1.Ant的劣势
(1)没有一个约定的目录结构
(2)必须明确让Ant做什么,什么时候做,然后编译、打包
(3)没有生命周期,必须定义目标和其实现的任务序列
(4)没有继承依赖管理
2.Maven取代Ant的优势
(1)拥有约定的目录结构,不需要配置Maven就知道你的代码放到了哪里
(2)拥有一个生命周期,比如使用命令mvn install就可以自动执行编译、测试、打包、安装到Maven仓库等过程
(3)拥有依赖管理、仓库管理
三、Maven的配置
1.两种settings.xml配置文件
* MAVEN_HOME/conf/settings.xml,这是全局的配置文件
* ~/.m2/settings.xml配,这是单个用户的配置文件
2.Maven约定的目录结构
项目文件夹
|------src
|------main
|------java //存放项目的java文件
|------resources //存放项目资源文件,如spring、hibernate的配置文件
|------test
|------java //存放所有测试的java文件
|------resources //存放测试需要的资源文件,如spring、hibernate的配置文件
|------target //存放项目生成的目标代码、资源文件等
|------pom.xml //项目核心配置文件
3.pom.xml配置文件中的标签讲解
详细配制方法见英文文档:http://maven.apache.org/pom.html
POM是"Project Object Model"的英文缩写,
(1)一个完整的pom.xml配置文件的格式如下:
<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.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <!-- The Basics -->
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<packaging>...</packaging>
<dependencies>...</dependencies>
<parent>...</parent>
<dependencyManagement>...</dependencyManagement>
<modules>...</modules>
<properties>...</properties> <!-- Build Settings -->
<build>...</build>
<reporting>...</reporting> <!-- More Project Information -->
<name>...</name>
<description>...</description>
<url>...</url>
<inceptionYear>...</inceptionYear>
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors> <!-- Environment Settings -->
<issueManagement>...</issueManagement>
<ciManagement>...</ciManagement>
<mailingLists>...</mailingLists>
<scm>...</scm>
<prerequisites>...</prerequisites>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<distributionManagement>...</distributionManagement>
<profiles>...</profiles>
</project>
(2)最简单的配置文件格式:
<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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.kdyzm.hello</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Hello</name> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency> </dependencies>
</project>
根节点必须是project标签;
modelVersion标志了POM的版本,maven2和maven3只支持4.0.0,而且该声明是必须的;
groupId、artifactId、version是maven坐标组成的三大元素,这就涉及到了什么是maven坐标的问题;
坐标,按照以前的理解,是用于唯一确定空间中某一点的度量,这里坐标有着相同的含义,它用来唯一标识一个项目,具体到某一个版本号,groupId、artifactId、version三个元素共同确定一个唯一的项目,它就像一个地址或者时间戳一样,一个项目使用它标识自己在maven库中的独一无二的位置。
groupId:一般使用类似于com.kdyzm.main这种域名的形式来表示,体现在maven系统中,就是java包结构一样的东西,这个字段不需要非得用这种形式,但是使用这种形式更加清晰,就像maven,它的工程都放到了以org.apache.maven为groupId的文件夹中,体现在maven仓库,其实就是org/apache/maven
artifacted:代表了工程的名字,不需要和真实的工程名字相一致,但是强烈推荐一致,方便记忆,不容易出错。
version:版本号
package:决定如果执行mvn package命令的话需要将项目生成的文件打包成什么样的类型,支持的类型如下:
pom, jar, maven-plugin, ejb, war, ear, rar, par.
dependencies:该标签的作用就是声明依赖的项目或者jar包,每一个依赖都是用dependendy标签来单独声明,声明的内容除了使用groupId、artifactId和version定位项目之外,还要有一个scope标签用来指定作用范围,其作用和java中的注解有些相似;理解这个需要先搞定maven项目的构建过程:
scope的所有支持类型:
compile:编译时有效,作用在上图中的编译阶段
test:测试时有效,作用在上图中的测试阶段
runtime:运行时有效,作用在测试阶段和以后的阶段
provided:顾名思义,当该项目运行的容器中提供了该jar包的时候(测试运行的时候没有该环境),需要将该依赖声明为provided,这样jar包就不会拷贝到运行的容器中了,这样能够防止jar包冲突问题的发生。
system:其作用和provided类似,但是需要除去一点,该jar包在本地maven库中不存在(有疑问)。
四、maven项目的生命周期
什么是生命周期?从创建到死亡的过程就是生命周期,一个比较完整的声明周期如下:
- validate
- generate-sources
- process-sources
- generate-resources
- process-resources 复制并处理资源文件,至目标目录,准备打包。
- compile 编译项目的源代码
- process-classes
- generate-test-sources
- process-test-sources
- generate-test-resources
- process-test-resources 复制并处理资源文件,至目标测试目录。
- test-compile 编译测试源代码。
- process-test-classes
- test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署
- prepare-package
- package 接受编译好的代码,打包成可发布的格式,如 JAR
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install 将包安装至本地仓库,以让其它项目依赖
- deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。
maven能够实现高度的自动化,当我们执行mvn compile命令的时候,其生命周期之前的命令都会依次执行一遍;同理,当我们执行mvn test命令的时候,包括mvn compile命令在内,其之前的命令都会依次执行一遍。
五、两个简单项目的练习
1.Hello项目,以下是maven项目的实际结构示意图
Hello
|------src
|------main
|------java
|------com/kdyzm/main/Hello.java
|------resources
|------test
|------java
|------com/kdyzm/main/test/HelloTest.java
|------resources
|------target
|------pom.xml
package com.kdyzm.main;
public class Hello
{
public int calculate(int input){
System.out.println("得到输入参数是:"+input);
return input*input;
}
}
com.kdyzm.main.Hello.java
package com.kdyzm.main.test; import org.junit.Test;
import com.kdyzm.main.Hello;
public class HelloTest
{
@Test
public void testHello(){
Hello hello=new Hello();
int result=hello.calculate(2);
System.out.println("计算得到的结果是:"+result);
}
}
com.kdyzm.main.test.HelloTest.java
<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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.kdyzm.hello</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Hello</name> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency> </dependencies>
</project>
Hello/pom.xml
使用maven命令进行管理:
- mvn compile 该命令能够将源代码编译,生成的class文件保存到了target文件夹中。
- mvn clean 该命令能够将target文件夹删除掉
- mvn clean test 该命令是一个组合命令,它能够先执行mvn clean命令,再执行mvn test命令
- mvn package 该命令是一个打包的命令,根据配置文件的不同,它会将生成的文件打包成不同的类型
- mvn install 该命令会先将项目打包,之后再将相关的jar包和配置文件拷贝到maven仓库中
- mvn clean install 该命令也是一个组合命令,它能够先执行mvn clean命令,然后执行mvn install命令
2.HelloFriend项目
HelloFriend
|------src
|------main
|------java
|------com/kdyzm/main/HelloFriend.java
|------resources
|------test
|------java
|------com/kdyzm/main/test/HelloFriendTest.java
|------resources
|------target
|------pom.xml
package com.kdyzm.main;
import com.kdyzm.main.Hello;
public class HelloFriend{
public String sayHello(int input){
System.out.println("HelloFriend类sayHello方法接收到的参数是:"+input);
Hello hello = new Hello();
int result=hello.calculate(input);
return result+"";
}
}
com.kdyzm.main.HelloFriend
package com.kdyzm.main.test;
import com.kdyzm.main.HelloFriend;
import org.junit.Test;
public class HelloFriendTest
{
@Test
public void testSayHello(){
HelloFriend helloFriend=new HelloFriend();
String result=helloFriend.sayHello(2);
System.out.println("testSayHello的执行结果是:"+result);
}
}
com.kdyzm.main.test.HelloFriendTest.java
<!--pom.xml配置文件-->
1 <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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.kdyzm.hello</groupId>
<artifactId>HelloFriend</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>HelloFriend</name> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency> <dependency>
<groupId>com.kdyzm.hello</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency> </dependencies>
</project>
六、maven仓库
当执行完成mvn install命令的时候,打包成jar的项目和相关配置文件就会保存到maven仓库中以便于向其他项目提供依赖,保存的目录是:~/.m2/repository/$groupId/$artifactId
例如以上两个项目执行完成mvn install命令之后,如果没有错误,那么在我电脑对应的目录上就会出现一下文件和目录:
【Java EE 学习 82 上】【MAVEN基本安装和使用方法】的更多相关文章
- 【Java EE 学习 79 上】【mybatis 基本使用方法】
一.简介 mybatis类似于hibernate,都是简化对数据库操作的框架,但是和hibernate不同的是,mybatis更加灵活,整体来说框架更小,这体现在它需要我们手写SQL语句,而hiber ...
- 【Java EE 学习 82 下】【MAVEN整合Eclipse】【MAVEN的一些高级概念】
一.MAVEN整合Eclipse MAVEN是非常优秀,但是总是要开命令行敲命令是比较不爽的,我们已经习惯了使用IDE,所以还有一种将MAVEN整合到Eclipse的方法. 详情查看:http://w ...
- 【Java EE 学习 80 上】【WebService】
一.WebService概述 什么是WebService,顾名思义,就是基于Web的服务,它使用Http方式接收和响应外部系统的某种请求,从而实现远程调用.WebService实际上就是依据某些标准, ...
- 【Java EE 学习 74 上】【数据采集系统第六天】【使用Jfreechart的统计图实现】【Jfreechart的基本使用方法】
之前已经实现了数据的采集,现在已经有了基本的数据,下一步就需要使用这些数据实现统计图的绘制了.这里使用Jfreechart实现这些统计图的绘制.首先看一下Jfreechart的基本用法,只有知道了它的 ...
- 【Java EE 学习 25 上】【网上图书商城项目实战】
一.概述 1.使用的jdk版本:1.6 2.java EE版本:1.6 3.指导老师:传智播客 王建 二.小项目已经实现的功能 普通用户: 1.登陆 2.注册 3.购物 4.浏览 管理员用户(全部管理 ...
- 【Java EE 学习 67 上】【OA项目练习】【JBPM工作流的使用】
OA项目中有极大可能性使用到JBPM框架解决流程控制问题,比如请假流程.报销流程等等. JBPM:JBoss Business Process Management,翻译过来就是业务流程管理.实际上就 ...
- 【Java EE 学习 83 上】【SpringMVC】【基本使用方法】
一.SpringMVC框架概述 什么是SpringMVC?SpringMVC是一个和Struts2差不多的东西,他们的作用和性质几乎是相同的,甚至开发效率上也差不多,但是在运行效率上SpringMVC ...
- 【Java EE 学习 78 上】【数据采集系统第十天】【Service使用Spring缓存模块】
一.需求分析 调查问卷中或许每一个单击动作都会引发大量的数据库访问,特别是在参与调查的过程中,只是单击“上一页”或者“下一页”的按钮就会引发大量的查询,必须对这种问题进行优化才行.使用缓存策略进行查询 ...
- 【Java EE 学习 77 上】【数据采集系统第九天】【通过AOP实现日志管理】【通过Spring石英调度动态生成日志表】【日志分表和查询】
一.需求分析 日志数据在很多行业中都是非常敏感的数据,它们不能删除只能保存和查看,这样日志表就会越来越大,我们不可能永远让它无限制的增长下去,必须采取一种手段将数据分散开来.假设现在整个数据库需要保存 ...
随机推荐
- Python Day15
JavaScript JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理. ...
- Java数据结构——平衡二叉树的平衡因子(转自牛客网)
若向平衡二叉树中插入一个新结点后破坏了平衡二叉树的平衡性.首先要找出插入新结点后失去平衡的最小子树根结点的指针.然后再调整这个子树中有关结点之间的链接关系,使之成为新的平衡子树.当失去平衡的最小子树被 ...
- Intellij Idea/Webstorm/Phpstorm 版本控制忽略文件
本地差异化配置,不需要提交,这时候需要在整个版本控制中忽略掉文件的提交. File -> Settings -> Version Control -> Ignored Files
- 前端构建工具之gulp_常用插件
gulp常用插件的使用 今天来看看一下gulp的常用插件的使用 就像gruntjs需要一个Gruntfile.js文件一样,gulp也需要一个文件作为它的主文件,在gulp中这个文件叫做gulpfil ...
- jQuery stop()用法
jQuery stop()的用法: stop(true)等价于stop(true,false): 停止被选元素的所有加入队列的动画. stop(true,true):停止被选元素的所有加入队列的动画, ...
- bzoj4555题解
我们计算$f(i)=\sum_{j=1}^i S(i,j)\times 2^j\times (j!)$,容(o)易(e)知(i)道(s)$f(i)$的指数生成函数为$\frac{1}{3-2\time ...
- Ajax深入解析
AJAX:Asynchronous JavaScript And Xml(异步的JS和XML) 同步:客户端发起请求>服务端的处理和响应>客户端重新载入页面(循环) 异步:客户端实时请求& ...
- 修改Firebug字体
Firebug是一件非常好用的调试工具,然而默认的字体有些单调,设置里又没有更改的选项,那么字体到底能不能更改呢?这个问题困扰了我好久,直到今天我才偶然发现了解决方案. Firebug属于火狐的一个插 ...
- Eclipse导出插件工程
一.Feature Projecties工程设置 1. 新建一个Feature Projecties 2. 选择我们的插件工程,finish 3. 在目录下新建一个Category definitio ...
- 2. 上传Android代码到github
1. 建立git仓库 cd到本地项目根目录,执行git命令 git init 同时会在项目根目录下生成一个.git的隐藏文件 windows下先禁用 ...