【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.htmlhttp://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配置文件的格式如下:

 1 <project xmlns="http://maven.apache.org/POM/4.0.0"
 2   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
 4                       http://maven.apache.org/xsd/maven-4.0.0.xsd">
 5   <modelVersion>4.0.0</modelVersion>
 6  
 7   <!-- The Basics -->
 8   <groupId>...</groupId>
 9   <artifactId>...</artifactId>
10   <version>...</version>
11   <packaging>...</packaging>
12   <dependencies>...</dependencies>
13   <parent>...</parent>
14   <dependencyManagement>...</dependencyManagement>
15   <modules>...</modules>
16   <properties>...</properties>
17  
18   <!-- Build Settings -->
19   <build>...</build>
20   <reporting>...</reporting>
21  
22   <!-- More Project Information -->
23   <name>...</name>
24   <description>...</description>
25   <url>...</url>
26   <inceptionYear>...</inceptionYear>
27   <licenses>...</licenses>
28   <organization>...</organization>
29   <developers>...</developers>
30   <contributors>...</contributors>
31  
32   <!-- Environment Settings -->
33   <issueManagement>...</issueManagement>
34   <ciManagement>...</ciManagement>
35   <mailingLists>...</mailingLists>
36   <scm>...</scm>
37   <prerequisites>...</prerequisites>
38   <repositories>...</repositories>
39   <pluginRepositories>...</pluginRepositories>
40   <distributionManagement>...</distributionManagement>
41   <profiles>...</profiles>
42 </project>

    (2)最简单的配置文件格式:

 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">
 2   <modelVersion>4.0.0</modelVersion>
 3   <groupId>com.kdyzm.hello</groupId>
 4   <artifactId>Hello</artifactId>
 5   <version>0.0.1-SNAPSHOT</version>
 6   <name>Hello</name>
 7   
 8     <dependencies>
 9         <dependency>
10             <groupId>junit</groupId>
11             <artifactId>junit</artifactId>
12             <version>4.9</version>
13             <scope>test</scope>
14         </dependency>        
15         
16     </dependencies>
17 </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命令的话需要将项目生成的文件打包成什么样的类型,支持的类型如下:

      pomjarmaven-pluginejbwarearrarpar

    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

1 package com.kdyzm.main;
2 public class Hello
3 {
4     public int calculate(int input){
5         System.out.println("得到输入参数是:"+input);
6         return input*input;
7     }
8 }
com.kdyzm.main.Hello.java
 1 package com.kdyzm.main.test;
 2 
 3 import org.junit.Test;
 4 import com.kdyzm.main.Hello;
 5 public class HelloTest
 6 {
 7     @Test
 8     public void testHello(){
 9         Hello hello=new Hello();
10         int result=hello.calculate(2);
11         System.out.println("计算得到的结果是:"+result);
12     }
13 }
com.kdyzm.main.test.HelloTest.java
 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">
 2   <modelVersion>4.0.0</modelVersion>
 3   <groupId>com.kdyzm.hello</groupId>
 4   <artifactId>Hello</artifactId>
 5   <version>0.0.1-SNAPSHOT</version>
 6   <name>Hello</name>
 7   
 8     <dependencies>
 9         <dependency>
10             <groupId>junit</groupId>
11             <artifactId>junit</artifactId>
12             <version>4.9</version>
13             <scope>test</scope>
14         </dependency>        
15         
16     </dependencies>
17 </project>
Hello/pom.xml

  使用maven命令进行管理:            

  1. mvn compile                       该命令能够将源代码编译,生成的class文件保存到了target文件夹中。
  2. mvn clean                           该命令能够将target文件夹删除掉
  3. mvn clean test                 该命令是一个组合命令,它能够先执行mvn clean命令,再执行mvn test命令
  4. mvn package                       该命令是一个打包的命令,根据配置文件的不同,它会将生成的文件打包成不同的类型
  5. mvn install                          该命令会先将项目打包,之后再将相关的jar包和配置文件拷贝到maven仓库中
  6. 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

 1 package com.kdyzm.main;
 2 import com.kdyzm.main.Hello;
 3 public class HelloFriend{
 4     public String sayHello(int input){
 5         System.out.println("HelloFriend类sayHello方法接收到的参数是:"+input);
 6         Hello hello = new Hello();
 7         int result=hello.calculate(input);
 8         return result+"";
 9     }
10 }
com.kdyzm.main.HelloFriend
 1 package com.kdyzm.main.test;
 2 import com.kdyzm.main.HelloFriend;
 3 import org.junit.Test;
 4 public class HelloFriendTest
 5 {
 6     @Test
 7     public void testSayHello(){
 8         HelloFriend helloFriend=new HelloFriend();
 9         String result=helloFriend.sayHello(2);
10         System.out.println("testSayHello的执行结果是:"+result);
11     }
12 }
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"> 2 <modelVersion>4.0.0</modelVersion> 3 <groupId>com.kdyzm.hello</groupId> 4 <artifactId>HelloFriend</artifactId> 5 <version>0.0.1-SNAPSHOT</version> 6 <name>HelloFriend</name> 7 8 <dependencies> 9 <dependency> 10 <groupId>junit</groupId> 11 <artifactId>junit</artifactId> 12 <version>4.9</version> 13 <scope>test</scope> 14 </dependency> 15 16 <dependency> 17 <groupId>com.kdyzm.hello</groupId> 18 <artifactId>Hello</artifactId> 19 <version>0.0.1-SNAPSHOT</version> 20 <scope>compile</scope> 21 </dependency> 22 23 </dependencies> 24 </project>

六、maven仓库

  当执行完成mvn install命令的时候,打包成jar的项目和相关配置文件就会保存到maven仓库中以便于向其他项目提供依赖,保存的目录是:~/.m2/repository/$groupId/$artifactId

  例如以上两个项目执行完成mvn install命令之后,如果没有错误,那么在我电脑对应的目录上就会出现一下文件和目录:

  

 

posted @ 2016-01-03 11:59  狂盗一枝梅  阅读(382)  评论(0编辑  收藏  举报