上篇文章讲解了Maven的安装与配置,并且演示了maven如何与Eclipse集成,本篇文章则就开始实战了,以一个简单的例子来说明Maven项目的建立与使用。
一、编写pom
要说Maven项目的核心是什么,就不得不说POM了。POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等。每个Maven项目下都要有一个POM文件,现在来看一个最简单的POM文件。
<projectxmlns="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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sld</groupId>
<artifactId>testMaven</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
</project>
代码的第一行是XML头,指定了该XML文档的版本和编码方式。下面就是重头戏了--Project元素,这个是所有pom.xml的根元素。我就分别来说说根元素下几个重要的子元素。
第一个子元素modelVersion指定了当前POM模型的版本,对于Maven2及Maven3来说,它只能是4.0.0。接下来就是groupId、artifactId和version这三个子元素了,他们共同定义了一个项目基本的坐标,在Maven的世界里,任何的jar、pom或者war都是以基于这些基本的坐标进行区分的。其中groupId定义了项目所属的组,这个组往往和项目所在的组织或公司存在关联,例如下例中的com.sld,这就是以我个人名义建立的一个项目。artifactId定义了当前Maven项目在组中唯一的ID。而version显而易见,指定了当前项目的当前版本。最后packaging则是该项目的类型,说明它是web项目、java项目或者ear项目。
上面这个简单的pom文件中没有项目依赖关系,如果我们需要声明的话,使用dependency即可。如下例:通过dependency来声明项目之间的依赖关系。
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
读者可以发现,没有任何java代码,我们就可以定义一个Maven项目的pom,这体现了Maven的一大优点,它能让项目对象模型最大程度地与实际代码相独立,这就实现了我们常说的解耦。这在很大程度上避免了Java代码和POM代码的相互影响。比如日后需要升级版本时我们只需要修改POM文件,而不需要修改java代码。
二、编写主代码
Maven项目建立完成后,我们就需要来编写java代码了,这里需要注意的是主代码和测试代码最大的区别:项目的主代码会被打包到最终的构件中,而测试代码只在运行测试时用到,不会被打包。默认生成Maven项目时,会出现以下几个文件夹:
其中需要我们操作的就是src/main/java和src/test/java目录,我们遵循maven的约定,在src/main/java目录下创建主代码,Maven会自动搜寻该目录找到主代码;在src/test/java目录下创建测试代码。这样在打包的时候,Maven会自动帮我们打包主代码,而忽略测试代码。
在目录下建包时,需要注意项目中Java类的包都应该基于项目的groupId和artifactId,这样更加清晰,更加符合逻辑,也方便搜索构件或者Java类。如下图所示:
关于主代码我这里就不再写了,编写完代码后,使用Maven进行编译,在项目的根目录下运行命令maven clean compile。clean告诉Maven要清理输出目录target/,compile则告诉Maven要编译项目主代码,编译完成后会在target/classes下。
三、编写测试代码
关于测试,我在前面博客中已经有了详细的介绍,这里只贴出pom文件,以供大家了解:
<projectxmlns="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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sld</groupId>
<artifactId>testMaven</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.cyrusinnovation</groupId>
<artifactId>mockito-groovy-support</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>
</project>
在这里我们使用的测试工具是Junit和Mockito,所以只需要在pom文件中声明对这两个jar包的依赖即可。
四、打包和运行
将项目进行编译、测试之后,下一个重要步骤就是打包(package)。在上面pom文件中,我们指定了打包类型jar(Maven默认使用的打包类型也是jar),暂时先简单地执行命令mvncleaninstall进行打包。关于Maven的最重要的命令,我们稍后再说。
至此,Maven项目流程我们大致走了一遍,侧重的只是Maven项目而非Java代码本身,介绍了POM、Maven项目结构以及如何编译、测试和打包等。你明白了些吗?