简介
在前一篇文章里已经介绍了怎么安装和配置maven。在安装好之后我们这里来看看怎么通过maven来构建一个工程并详细的了解一下maven的配置文件里各配置项是什么意思。只有理解清楚这些之后我们才能够更好的运用好这个工具。
创建一个示例工程
首先我们尝试创建一个普通的工程。在命令行的情况下,我们输入如下命令:
mvn archetype:generate -DgroupId=com.yunzero -DartifactId=SampleProject -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
系统会显示如下的输出:
[INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building Maven Stub Project (No POM) 1 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] >>> maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom >>> [INFO] [INFO] <<< maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom <<< [INFO] [INFO] --- maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom --- [INFO] Generating project in Batch mode [INFO] ---------------------------------------------------------------------------- [INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.0 [INFO] ---------------------------------------------------------------------------- [INFO] Parameter: groupId, Value: com.yunzero [INFO] Parameter: packageName, Value: com.yunzero [INFO] Parameter: package, Value: com.yunzero [INFO] Parameter: artifactId, Value: SampleProject [INFO] Parameter: basedir, Value: /home/frank/programcode/spring [INFO] Parameter: version, Value: 1.0-SNAPSHOT [INFO] project created from Old (1.x) Archetype in dir: /home/frank/programcode/spring/SampleProject [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 13.278s [INFO] Finished at: Sun Dec 14 22:32:31 CST 2014 [INFO] Final Memory: 12M/239M [INFO] ------------------------------------------------------------------------
这表示一个工程已经建立好了。那么我们前面的这个命令表示什么意思呢?它究竟做了什么?我们又创建了一个什么样的工程呢?我们一点点详细的分析过来。
先看我们建立的这个工程的结构:
如上图所示,这里表示一个普通的java console工程结构。这是我们用命令行建立的。如果我们考虑用IDE工具来建立工程呢?也可以用类似的方式。我们以eclipse为例。
1. 首先选择新建一个maven project:
2. 然后选择Next, 在这里选择工程所在的目录,我们选择默认的位置,如下图:
3. 选择next之后再继续选择archetype
这里,也选择默认的maven-archetype-quickstart。然后继续选择Next。如果我们留意的话会发现这个类型的archetypeid也就是我们前面命令行创建工程里指定的。
4. 在这一步选择Group Id和Artifact Id:
在这一步,设置的Group Id和artifact Id也就是我们前面命令行里指定的那样。这样,我们就建立了一个简单的maven示例工程了。它的结构如下图:
这样,我们通过命令行和IDE两种方式创建了一个示例工程。下面我们针对命令行的参数和pom.xml文件里的一些项进行详细的讨论。
参数解释
我们在最开始创建maven工程的时候指定了archetype参数。然后在后面的参数里又指定了archetypeartifactId。
archetype: 指的是我们如果要通过maven创建一个项目工程的话,因为具体针对不同类型的项目它的结构组织不一样,于是maven就提供了一个项目创建的模板。这些模板包含了一些最佳实践,这样可以使得我们在构建项目的时候节约不少实践。比如说,我们需要创建一个普通的console应用,那么它的结构模板必然是一种样式,而如果要构建一个JavaEE的项目,它的结构则不一样。既然我们需要针对不同项目提供不同的模板,于是就有了一个需要怎么来定义和区分它们的问题。这样就有了archetypeArtifactId。
archetypeArtifactId: 指的是针对archetype的具体模板。比如说maven-archetype-quickstart表示的是一个创建的普通maven工程。针对不同类型的工程,我们可以在maven的官网上查找对应的类型,也可以在通过IDE创建工程的时候去筛选 。
除了上述的两个之外,还要两个比较重要的参数:
groupId: 相当于一个对应项目的唯一区分标识。这样说起来还是有点模糊。如果考虑到我们做java项目的时候,要对一些包命名,而且一些包的命名需要具有唯一性。所以这个groupId就是我们创建的项目里最高层包的命名。
artifactId: 表示生成的包的名字。当我们将一个项目编译后打包的时候,需要确定一个打包名字并部署到实际测试或者生产环境中,所以在这个地方来确定最后包的名字。
上述的几个参数就是我们创建maven工程用到的。在前面的参数里,我们还设置了 -DinteractiveMode=false。它表示禁用交互的模式来创建工程。这表示什么意思呢?因为我们在命令行里已经指定了项目的类型和包名以及结构。如果我们想省略这一点的话,可以直接运行:
mvn archetype:generate
这个时候系统会显示所有的archetype类型,然后交互的提示我们输入对应的archetype,以及groupId和artifact Id。
pom.xml文件
我们再来看看通过命令行自动生成的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> <groupId>com.yunzero</groupId> <artifactId>SampleProject</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>SampleProject</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
前面的groupId和artifactId也定义在这里。<version>部分表示我们常用版本管理中定义的版本号,比如我们常用的RC, alpha, beta, SNAPSHOT。在这里SNAPSHOT表示当前项目处在一个开发的阶段。当一个工程使用SNAPSHOT的依赖时,Maven会每次去获取最新的SNAPSHOT版本。
还有一个是<packaging>,它表示对于这个工程,需要创建一个JAR包。
在下面的<properties>里面,我们通常用来定义一些自定义的变量,方便他们重用。比如说我们需要使用某些版本的jar组件,它们有多个组件,但是是同样的版本,我们就可以这样来定义,比如说:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <jdk.version>1.6</jdk.version> <spring.version>4.1.2.RELEASE</spring.version> </properties> <!-- Spring Core --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency>
这里我们用到了spring-core, spring-context等几个artifact,于是可以直接引用同样的版本信息变量。
除了这些以外,刚才我们看到很重要的一个就是依赖信息的定义,比如这里我们项目中需要使用到spring-core, spring-context,于是我们就需要在<dependencys>里面定义一个<dependency>的子元素。一个dependency里面指定一个组件的groupId, artifactId和version。可能我们有时候会有点疑惑,这些jar包到哪里去找呢?一般如果我们知道需要使用哪些组件的话,可以去:http://search.maven.org/来搜索需要的组件,在那里可以将需要的maven依赖定义信息直接拷过来。比如下图的spring依赖信息:
这样,一个基本的maven工程所需要的信息就配置好了。在后续的文章里,我们再讨论maven的生命周期和一些plugin的使用情况。