Maven实战学习笔记 3.Maven使用入门

来源:互联网 发布:redis与mysql结合 编辑:程序博客网 时间:2024/04/20 03:31
 在安装好Maven后,编写一个简单的不依赖IDE的Hello World项目。

3.1 编写pom文件

        Maven项目的核心是pom.xml文件,创建一个Hello-word文件夹,在下面新建一个pom.xml文件,内容如下。
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. <?xml version = "1.0" encoding = "UTF-8"?>  
  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/maven-v4_0_0.xsd">  
  3.   <modelVersion>4.0.0</modelVersion>  
  4.   <groupId>com.liuxm.test</groupId>  
  5.   <artifactId>hello-word</artifactId>  
  6.   <version>1.0-SNAPSHOT</version>  
  7.   <name>Maven Hello World Project</name>   
  8. </project>  
        modelVersion指定了当前pom的版本。
        groupId定义了项目属于哪个组。
        artifactId定义了当前Maven项目在组中的唯一id.
        version指定了当前项目的版本。
groupId,artifactId,version定义了一个项目的基本坐标。‘

3.2 编写java程序代码

    默认情况下,Msven假设项目主代码位于src/main/java目录下,首先按照约定,创建该目录,然后在该目录下创建HelloWorld.java文件。
(G:\studyVideo\maven\hello-word\src\main\java\com\liuxm\test\HelloWorld.java)
[java] view plain copy 在CODE上查看代码片派生到我的代码片
  1. package com.liuxm.test;  
  2.   
  3. public class HelloWorld{  
  4.    public String sayHello(){  
  5.        return "Hello World";  
  6.    }  
  7.      
  8.    public  static void main(String[] args){  
  9.        System.out.println(new HelloWorld().sayHello());  
  10.    }  
  11. }  
注意:
1、应该讲项目主代码放到src/main/java/目录下(遵循java的约定),而无需额外的配置,Maven会自动搜寻该目录找到项目主代码。
2、java的包名尽量与pom.xml文件中groupId吻合,这样结构比较清晰。
代码编写完毕后,进行编译,在主目录下mvn clean compile

clean告诉Maven清理输出目录target,compile告诉Maven编译项目主代码。
从输出中看到Maven首先执行clean任务,删除target/目录,默认情况下,Maven构建的所有输出都在target/目录下。
                                     然后执行resource任务,由于没有定义此项,所以跳过了。
                                     最后执行compile任务,将项目代码编译到target/classes目录。
上面提到的clean是clean插件的clean目标,compile是compiler插件的compile目标。
编译后主目录:

3.3 编写测试代码

        为了项目结构清晰,主代码与测试代码分别位于不同的目录下,Maven默认的测试代码的目录是src/test/java。因此,在编写测试用例之前,
应当先创建该目录。
       在java的世界里,JUnit是事实上的单元测试的标准。要使用JUnit,首先需要为Hello World项目添加一个JUnit依赖。
pom.xml文件修改为:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span><pre name="code" class="java"><?xml version = "1.0" encoding = "UTF-8"?>  
  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/maven-v4_0_0.xsd">  
  3.   <modelVersion>4.0.0</modelVersion>  
  4.   <groupId>com.liuxm.test</groupId>  
  5.   <artifactId>hello-word</artifactId>  
  6.   <version>1.0-SNAPSHOT</version>  
  7.   <name>Maven Hello World Project</name>   
  8.   <dependencies>  
  9.       <dependency>  
  10.           <groupId>  
  11.               junit  
  12.           </groupId>  
  13.           <artifactId>  
  14.               junit  
  15.           </artifactId>  
  16.           <version>  
  17.               4.7  
  18.           </version>  
  19.           <scope>  
  20.               test  
  21.           </scope>  
  22.       </dependency>  
  23.   </dependencies>  
  24.   <build>  
  25.       <plugins>  
  26.           <plugin>  
  27.               <groupId>  
  28.                   org.apache.maven.plugins  
  29.               </groupId>  
  30.               <artifactId>  
  31.                   maven-compiler-plugin  
  32.               </artifactId>  
  33.               <configuration>  
  34.                   <source>1.5</source>  
  35.                   <target>1.5</target>  
  36.               </configuration>  
  37.           </plugin>  
  38.       </plugins>  
  39.   </build>  
  40. </project>  

        代码添加dependencies元素,该元素下可以包含多个dependency元素声明项目的依赖。这里添加了依赖,groupId ,artifactId,version是4.7.

前面提到groupId,artifactId和version是任何一个maven项目的基本坐标,有了这段声明,Maven就能够自动下载junit-4.6.jar从中央仓库
(http://repo1.maven.org/maven2),下载需要的文件。
        上面的pom文件还增加了scope元素,scope是依赖范围,若依赖范围为test,则表示该依赖仅对测试有效。所以,在测试代码中使用junit是可以
的,但是在主代码中使用junit就会编译报错。
       由于历史原因,Maven核心插件只支持1.3,所以配置增加build配置项来支持java1.5。
       接下来测试一下,HelloWorld类的sayHello方法,在srt/test/java下创建java文件。
[java] view plain copy 在CODE上查看代码片派生到我的代码片
  1. package com.liuxm.junit;  
  2.   
  3. import static org.junit.Assert.assertEquals;  
  4. import org.junit.Test;  
  5. import com.liuxm.test.HelloWorld;  
  6.   
  7. public class HelloWorldTest  
  8. {  
  9.     @Test  
  10.     public void testSayHello()  
  11.     {  
  12.         HelloWorld helloworld = new HelloWorld();  
  13.         String result = helloworld.sayHello();  
  14.         assertEquals("Hello World",result);       
  15.     }  
  16. }  
在主目录下:运行mvn clean test命令。


3.4 打包与运行

    运行命令: mvn clean package   可以看到下面的输出,默认打包类型为jar。
    
         Maven会在打包之前执行编译,测试等操作,这里jar任务负责打包,实际上就是jar插件的jar目标将项目主代码打包成一个名为
hello-word-1.0-SNAPSHOT.jar的文件,命名格式为artifactId-version.jar,如果有需要就可以把这个jar文件复制到其他项目的classPath
中,从而使用HelloWorld类。但是如何才能让其他的Maven项目直接引用这个jar呢? 这里需要执行一个安装步骤,执行
mvn clean install 命令将jar包安装到本地仓库。
   
         从输出可以看到,该任务将hello-word 项目的pom文件及jar包安装到了本地的仓库,这样其他的项目可以通过pom文件直接
对hello-world项目进行引用了。
       目前为止:已经使用了mvn clean compile,mvn clean test,mvn clean package, mvn clean install.执行test之前会先执行compile。
执行package之前会先执行test,在执行install之前会先执行package,可以在任何项目中使用这些命令。
         然而,还没有运行HelloWord项目,在HelloWorld类里面可是有一个main方法的。默认打包生成的jar是不能直接运行的,因为
带有main方法的类信息不会添加到manifest中(Jar中的MANIFEST.MF是一种告示文件Manifest file 用来声明该包采用的技术标准和
所需的运行环境等参数。运行环境先从MF中读取这些参数,如果能满足就运行,不然就提示不能满足条件)。
        如果需要生成可执行的jar包,需要借助maven-shade-plugin,配置插件方式如下:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. <plugin>    
  2.       <groupId>org.apache.maven.plugins</groupId>    
  3.       <artifactId>maven-shade-plugin</artifactId>    
  4.       <version>1.2.1</version>    
  5.       <configuration>    
  6.           <createDependencyReducedPom>false</createDependencyReducedPom>    
  7.       </configuration>    
  8.       <executions>    
  9.           <execution>    
  10.               <phase>package</phase>    
  11.               <goals>    
  12.                   <goal>shade</goal>    
  13.               </goals>    
  14.               <configuration>    
  15.                   <transformers>    
  16.                       <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">    
  17.                           <mainClass>com.liuxm.test.HelloWorld</mainClass>    
  18.                       </transformer>    
  19.                   </transformers>    
  20.               </configuration>    
  21.           </execution>    
  22.       </executions>    
  23.   </plugin>   
 然后在运行:mvn clean install   项目在打包时会将mainclass信息放到manifest.mf文件里面,打开target可以看到里面有hello-word-1.0-SNAPSHOT.jar
与original-hello-word-1.0-SNAPSHOT.jar,前者是可运行的jar,后者是原始jar,打开hello-word-1.0-SNAPSHOT.jar可以在manifest.mf文件中看到如下信息:
[plain] view plain copy 在CODE上查看代码片派生到我的代码片
  1. Manifest-Version: 1.0  
  2. Build-Jdk: 1.6.0_21  
  3. Built-By: Administrator  
  4. Created-By: Apache Maven 3.2.1  
  5. Main-Class: com.liuxm.test.HelloWorld  
  6. Archiver-Version: Plexus Archiver  
文件中已经包含了
[plain] view plain copy 在CODE上查看代码片派生到我的代码片
  1. Main-Class: com.liuxm.test.HelloWorld  
接下来在根目录下执行这个jar文件:


3.5 使用Archetype生成项目骨架

    运行:mvn  archetype:generate
    选择版本:
   
会自动在当前运行命令的目录下生成Maven工程的框架。

3.6 eclipse下maven的使用

3.6.1 Maven 插件安装

        我这里就不赘述插件的安装过程了,推荐大家一个链接:http://blog.csdn.net/wode_dream/article/details/38052639
由于我32位系统下下载的eclipse版本为eclipse-jee-mars-2-win32,默认已经安装了。


  将使用的Maven修改为我们自己电脑上安装的Maven,不要使用IDE内嵌的,内嵌的可能不稳定:


3.6.2 导入Maven项目

   FIle->import->Maven->Existing  Maven Projects  ,在浏览时只需要选择已经导入工程的根目录(即包含pom.xml)的那个目录。

3.6.3  创建Maven项目

    File->New->Other  在弹出的对话框选择Maven Project,输入Group Id ,ArtifictId ,Version 后Finish.

3.6.4  运行Mvn命令

    工程右键->run as 可以看到 maven test,maven package,maven 等常用的命令。
    也可以在run as->run configurations->双击Maven build 在Goals里面输入需要执行的任务。
0 0