maven的学习与使用

来源:互联网 发布:mac 用什么三维软件 编辑:程序博客网 时间:2024/05/19 20:42

POM(Project Object Model)

在POM中,groupId,artifactld,packaging,version叫做maven的坐标,它能唯一的确定一个项目。有了maven坐标,我们就可以用它来制定我们的项目所依赖的其他项目,插件,或者父项目。一般maven坐标写成如下的格式:

groupId:artifactId:packaging:version

像我们的例子就会写成:com.mycompany.helloworld:helloworld:jar:1.0-SNAPSHOT

我们的helloworld示例很简单,但是大项目一般会分成几个子项目。在这种情况下,每个子项目就会有自己的POM文件,然后他们会有一个共同的副项目。这样只要构建副项目就能够构建所有的子项目了。子项目的POM会继承父项目的POM。另外,所有的POM都继承了一个Super-POM.Super-POM设置了一些默认值,它遵循了惯例优于配置的原则。所以尽管我们看到的POM很简单,但是这些知识你看得见的一部分。运行时候的POM要复杂的多。

Maven插件

mvn archetype:generate命令来生成一个项目。那么这里的archetype是一个插件的名字,generate是目标的名字。这个命令的意思是告诉maven执行archetype插件的generate目标,插件目标通常会写成:pluginId:goalId

一个目标是一个工作单元,而插件则是一个或者多个目标的集合。比如说Jar插件,Compiler插件,Surefire插件等等。Jar插件包含建立Jar文件的目标,Compiler插件包含变异源代码和单元测试的目标。Surefire插件则是运行单元测试的目标。

看到这里,估计你能明白了,mvn本身不会做太多的事情。他不知道怎么打包或者编译。它把构建的任务交给插件去做。插件定义了常见的构建逻辑,能够被重复利用。


maven生命周期

mvn package。这里的package是一个maven的生命周期阶段。生命周期指项目的构建过程,它包含了一系列有序的阶段,而一个阶段就是构建过程的一个步骤。

那么生命周期阶段和上面所说的插件目标之间是什么关系呢?插件目标可以绑定到生命周期阶段上。一个生命周期可以绑定多个插件目标。当maven在构建过程中逐步的通过每个阶段时,会执行该阶段的所有插件目标。


maven以来管理

maven坐标能够确定一个项目。换句话说,我们可以用它来解决依赖关系。在POM中,依赖关系是在dependencies部分中定义的。例如下面对于junit的依赖:

<dependencies>     <dependency>       <groupId>junit</groupId>       <artifactId>junit</artifactId>       <version>3.8.1</version>       <scope>test</scope>     </dependency>   </dependencies> 
例子很简单,但是实际开发中我们会有复杂的多的依赖关系,因为被依赖的jar文件会有自己的依赖关系。那么我们是不是需要把那些间接依赖的jar文件也都定义在POM文件中呢?答案是不需要,因为maven提供了传递依赖的特性。所谓的传递依赖,是指maven会检查被依赖的jar文件,把它的依赖关系纳入最终的依赖关系链中。

在POM中的dependencies部分中,scope决定了依赖关系的适用范围。我们的例子中的junit的scope是test,那么它只会执行compiler:testCompile and surefire:test目标的时候才会被加到classpath中,在执行compiler:compile目标时是拿不到junit的。

我们还可以指定scope为provided,意思是JDK或者容器会提供所需的jar文件。比如说在做web应用开发的时候,我们在编译的时候需要servlet API jar文件,但是在打包的时候不需要把这个文件打在war中,因为servlet容器或者应用服务器会提供。scope的默认值是compile,即任何时候都会被包含在classpath中,打包时也会被包括进去。


maven库

当第一次运行maven命令时,你需要internet连接,因为它要从网上下载一些文件。那么它从哪儿里下载呢?它是从maven默认的远程库(http://repo1.maven.org/maven2)下载的。这个远程库有maven的核心插件和可供下载的jar文件。但是不是所有的jar文件都是可以凑够默认的远程库下载的,比如我们自己开发项目时,有两个选择:要么在公司内部设置定制库,要么手动下载和安装所需的jar文件到本地库。

本地库是指maven下载了插件或者jar文件后存放在本地机器的拷贝。在linux它的位置在~/.m2/repository,。当maven查找需要的jar文件时,它会现在本地库中寻找,找不到的时候才回去远程库中找。一旦一个项目被安装到了本地库后,你别的项目就可以通过maven坐标和这个项目监理依赖关系。比如我现在有一个新项目需要用到helloworld,那么在运行了mvn install命令之后,就可以建立如下依赖关系

<dependency><span style="white-space:pre"></span><groupId>com.mycompany.helloworld</groupId><span style="white-space:pre"></span><artifactId>helloworld</artifactId><span style="white-space:pre"></span><version>1.0-SNAPSHOT</version></dependency>




0 0
原创粉丝点击