Maven学习笔记(三) :Maven使用入门

来源:互联网 发布:网上抢手机软件知乎 编辑:程序博客网 时间:2024/04/30 19:44

编写POM:

     Maven项目的核心是pom.xml。POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。
     现在先为Hello World项目编写一个最简单的pom.xml。
<?xml version="1.0" encoding="UTF-8"?><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/maven-v4_0_0.xsd">     <modelVersion>4.0.0</modelVersion>     <groupId>com.juvenxu.mvnbook</groupId>     <artifactId>hello-world</artifactId>     <version>1.0-SNAPSHOT</version>     <name>Maven Hello World Project</name></project> 
    代码的第一行是XML头,指定了该xml文档的版本和编码方式。紧接着是project元素,project是所有pom.xml的根元素,它还声明了一些POM相关的命名空间及xsd元素,虽然这些属性不是必须的,但使用这些属性能让第三方工具能提供该xml的随笔功能。
     modelVersion指定当前POM模型的版本,对于Maven2及Maven3来说,它只能是4.0.0。
     groupId、artifactId、version这三个元素定义了一个项目基本的坐标。groupId定义了项目属于哪个组,这个组往往和项目所在的组织或公司有关联。譬如在googlecode上建立一个名为myphone的组,那么groupId就是com.googlecode.myphone。
     artifactId定义了当前Maven项目在组中唯一的ID,通常情况下是一个项目或者子项目的名字。例如myphone组下有一个项目为google-phone,你可能会为不同的子项目(模块)分配artifactId,如google-phone-util、google-phone-domain、google-phone-web。
     version指定了项目当前的版本 1.0-SNAPSHOT,SNAPSHOT意为快照,说明还在开发中,是不稳定的版本。version会不断升级,如1.0、1.1-SNAPSHOT。

编写主代码:

     项目主代码会被打包到最终的构件中(如jar),而测试代码只会在运行测试时用到。默认情况下,项目主代码位于src/main/java目录,创建在该目录下的好处是无须额外的配置,在以后使用的过程中,Maven会自动搜寻该目录找到项目主代码。
     我们编写HelloWorld.java所在目录是src/main/java/com/juvenxu/mvnbook/helloworld/HelloWorld.java,则该java的文件包名为:com.juvenxu.mvnbook.helloworld,这与POM中定义的gruopId和artifactId相吻合,一般来说,项目中java类的包名都应该基于项目的groupId和artifactId,这样更加清晰,也更符合逻辑,也方便搜索构件。
package com.juvenxu.mvnbook.helloworld;public class HelloWorld{     public String sayHello()     {          return "Hello Maven";     }     public static void main(String[] args)     {          System.out.print(new HelloWorld().sayHello());     }}     
     代码编写完后,使用maven进行编译,在项目根目录下运行命令mvn clean compile会得到以下输出:

     可以看到其中执行了三个插件,maven-clean-plugin、maven-resources-plugin、maven-compile-plugin,clean会清理输出目录target/,resouce会处理资源文件,compile会编译项目主代码放在target/classes中(编译好的类为com/juvenxu/mvnbook/helloworld/HelloWorld.Class)。
     可以看到,Maven很方便的执行项目的清理和编译任务。

编写测试代码:

     为了保持项目结构清晰,主代码与测试代码应该分别位于独立的目录中。Maven项目中的默认的测试代码目录是src/test/java。在编写测试用例之前,应当先创建该该目录。
     为了使用JUnit进行单元测试,我们需要在pom.xml中添加对JUnit构件的依赖,修改后的pom.xml如下:
<?xml version="1.0" encoding="UTF-8"?><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/maven-v4_0_0.xsd">     <modelVersion>4.0.0</modelVersion>     <groupId>com.juvenxu.mvnbook</groupId>     <artifactId>hello-world</artifactId>     <version>1.0-SNAPSHOT</version>     <name>Maven Hello World Project</name>     <dependencies>          <dependency>               <groupId>junit</groupId>               <artifactId>junit</artifactId>               <version>4.7</version>               <scope>test</scope>          </dependency>     </dependencies></project>
     代码中添加了dependencies元素,该元素下可以包含多个dependency元素以声明项目的依赖。这里添加了Junit的一个坐标。有了这段声明,Maven会自动访问中央仓库http://search.maven.org/#browse下载所需的文件。上面pom.xml代码中还有一个值为test的元素scope,scope为依赖范围,若依赖范围为test,则表示该依赖只对测试有效,则在主代码中使用该JUnit就会出错,而在测试代码中使用不会出错。scope默认值为compile,表示该依赖对主代码和测试代码都有效。
     接下来编写测试代码:
package com.juvenxu.mvnbook.helloworld;import static org.junit.Assert.assertEquals;import org.junit.Test;public class HelloWorldTest{     @Test     public void testSayHello()     {          HelloWorld helloWorld = new HelloWorld();          String result = helloWorld.sayHello();          assertEquals("Hello Maven",result);     }}
     编写玩测试用例后,就可以调用maven执行测试。运行mvn clean test。(说明:较新版本的maven不会提示Junit的Annotation无法的问题,如@Test)。   
     命令行虽然只输入了mvn clean test,而maven实际所做的处理有:clean:clean(执行maven-clean-plugin的clean目标,下面类同)、resources:resources、compile:compile、resources:testRescources、compile:testCompile、surefire:test。需要知道的是,在Maven执行测试(surefire:test)之前,会先执行项目主资源的处理、主代码的编译、测试资源的处理、测试代码的编译等工作,这是maven生命周期的一个特性。测试代码通过编译之后在target/test-classes下生成了测试文件。
     maven在执行上诉处理之前,会读取pom.xml,执行一些操作,如查看相关依赖是否在本地仓库中存在,如果不存在则前往中央仓库下载。在上面的例子中,maven会去下载junit-4.7.pom和junit-4.7.jar文件。
     

打包和运行:

     hello-world的POM中没有指定打包类型,使用默认的打包类型jar。执行命令mvn clean package进行打包。
     
     maven会在打包之前执行编译、测试等操作,打包后的文件位于target/中,它时根据artifact-version.jar规则来进行命名的。
     为了让其他的maven项目直接可以该jar包,还需要执行一个安装的命令,mvn clean install ,将其安装在本地仓库中。
     
     打开本地仓库的相应目录可以看到hello-world项目的pom和jar。
     我们已经学习了Maven的最主要命令:mvn clean compile、mvn clean test、mvn clean package、mvn clean install。执行compile之前会先执行clean,执行test之前会先执行compile,执行package之前会先执行test、执行install之前会先执行package。
     在我们的HelloWorld类中存在一个main方法,但是默认打包生成的jar是不能直接运行的,我们需要额外在pom.xml中配置maven-shade-plugin插件来实现这个功能。
   <plugin>    <groupId>org.apache.maven.plugins</groupId>    <artifactId>maven-shade-plugin</artifactId>    <version>1.2.1</version>    <executions>      <execution>        <phase>package</phase>        <goals>          <goal>shade</goal>        </goals>        <configuration>          <transformers>            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">              <mainClass>com.juvenxu.mavenbook.helloworld.HelloWorld</mainClass>            </transformer>          </transformers>        </configuration>      </execution>    </executions>  </plugin>
     plugin元素在POM中的相对位置应该在<project><build><plugins>下面。然后重新执行mvn clean package进行打包。
     现在,我们在项目根目录中执行该jar文件:

 可以看到我们的main函数执行成功了。
 代码在下面地址中提供下载:http://download.csdn.net/detail/troy__/7944359

使用Archetype生成项目骨架:

     Maven中有一些约定:在项目的根目录中放置pom.xml,在src/main/java目录中放置项目的主代码,在src/test/java中放置项目的测试代码.... 如果我们每次都手动建立这些文件夹,那就太费劲了。为此,maven提供了Archetype以帮助我们快速勾勒出项目骨架。
     在你的workspace目录下输入:mvn archetype:generate命令。如下图:

    maven会要求你选择archetype的类型,一般情况下使用默认的maven-archetype-quickstart,无需输入直接回车即可,然后会要求选择这类型的版本,推荐maven-archetype-quickstart使用1.1。然后会要求输入该项目的一些配置信息,如groupId、artifactId、version、package。
     这里使用的是一个基本的archetype,如果有很多项目拥有类似的自定义项目结构以及配置文件,则可以定义自己的Archetype,在以后的项目中用自己的Archetype生成骨架。

m2eclipse简单使用:

     1. 导入Maven项目
     在实际工作中,我们几乎是离不开IDE的,在这里我们先讲解如何从eclipse中导入Maven项目,当然前提是安装好了m2eclipse插件。
     eclipse->File->Import->Maven->Existing Maven Project,然后单击next,然后选择该Maven项目所在根目录。可以看到:

     然后点击Finish即可。
     导入完成之后,就可以在Package Explorer视图中看到如下图所示的项目结构。

    2. 创建Maven项目
     File->New->Project->Maven->Maven Project,单击Next,然后在弹出的对话框中使用默认的选项,再次点击Next(不要选择create a simple project,以便我们能使用archetype搭建骨架),接下来出现的对话框会要求选择archetype,选择maven-archetype-quicksort,然后再单击next。接着出现一个新的对话框,要求我们输入GroupId、artifactId、version、package等信息。输入完成后,单击Finish即可,maven项目就创建好了。

3.运行Maven命令
     利用m2eclipse可以在eclipse中执行Maven的命令,同时也能在Eclipse的console中看到构建输出。在Maven项目或者pom.xml上右击,再在弹出的快捷菜单中选择Run As,就能看见常见的Maven命令。
     如果没有找到想要的命令,还可以在常见的maven命令菜单中选择maven build...,在弹出的对话框中的goal栏中输入你要执行的maven命令,注意命令不要带mvn的前缀。

1 0
原创粉丝点击