Maven基础

来源:互联网 发布:黑暗之魂3优化补丁 编辑:程序博客网 时间:2024/05/16 06:52

在Maven中仓库被用于保存和创建各种类型的artifacts(模块)以及依赖。简单来讲,仓库主要就是用于存放我们项目中用到的各种各样的jar包了,我们在pom.xml中声明的所有依赖jar包,其实都是来自本地仓库的引用。在上图中我们可以看到Maven有两种仓库,分别是local(本地)仓库和remote(远程)仓库,我们在使用Maven的过程中,比如运行一些Maven命令可以发现命令行的Downloading字样的信息:


其实就是Maven自动的从远程仓库去下载我们需要的依赖和库到Maven本地仓库。本地仓库的默认路径是~/.m2/repository,如下图所示:


图中就是Maven的本地仓库目录,可以看到许多已经下载好的依赖文件了。Maven本地仓库的默认路径在C盘,但通常我们不喜欢把文件存放在C盘,例如重装系统文件会丢失,或者占用C盘空间会影响操作系统运行速度等等原因,我们更愿意自定义仓库的目录,其实也很简单,找到Maven的全局配置文件(Maven安装目录下的conf/settings)文件,我们找到localRepository元素修改为本地路径即可:

view plaincopy to clipboardprint?
  1. <!-- localRepository   | The path to the local repository maven will use to store artifacts.   |   | Default: ${user.home}/.m2/repository  <localRepository>/path/to/local/repo</localRepository>  -->  <localRepository>E:\apache-maven-3.3.3\repo</localRepository>  
如上图所示我们将本地仓库的路径放在了Maven安装路径的根目录下的repo目录下,再次使用Maven的时候我们可以发现自动下载的依赖包都会保存在我们新指定的本地仓库路径下了:



说完了本地仓库,再回头看看上面黑窗口的那张图,Downloading后面的用红色线条标出的下载地址,那个就是Maven官方的全球远程仓库的地址了,我们可以在浏览器中尝试访问一下,发现会自动跳转到另一个地址:


这里可以看到许多我们认识的库了,比如android中常用的httpclint,还有spring中aop会用到的aopalliance等等。这个Maven中央仓库包含了绝大多数开源构件、源码以及作者信息等等,下面推荐2个主流的提供Maven搜索服务的站点,可用于查询某个具体的库的坐标信息:

http://mvnrepository.com/

http://search.maven.org/


对了,这里提到了坐标,这个概念也需要学习一下,虽然很简单但是也是Maven中很重要的概念之一。

Maven的坐标指的就是用来标识某个唯一的构件的规范,一个坐标通常由三部分组成,分别是:

  • groupId
  • artifactId
  • version
例如:
view plaincopy to clipboardprint?
  1. <dependency>  <groupId>junit</groupId>    <artifactId>junit</artifactId>  <version>3.8.1</version></dependency>  

Maven中拥有大量的各种各样的构件,所以我们需要拥有这种统一的规范来标识每一个构件的唯一性。

学习了上面这些概念之后,我们就可以继续上一篇blog学习剩余的几个重要的Maven命令了。



清理(clean)、安装(install)



首先来看一下clean命令,这个命令很简单,作用就是清理编辑结果,即:删除target文件夹以及内容。


可以看到clean之前target文件夹是存在的,即maven在compile之后为我们生成的用于存放编译结果的目标文件夹,现在我们执行clean命令:


可以看到当我们执行了clean命令之后,显示了Deleting F:/MavenTest02/target,即删除了target文件夹,最后显示了BUILD SUCCESS字样即执行成功。


接下来我们再看一下install命令,同样的进入MavenTest02目录,运行mvn install命令:


可以看到上图中标出的信息,Installing F:/MavenTest02/pom.xml to E:/apache-maven-3.3.3/repo...

不难发现我们的MavenTest02已经成功打包并作为一个普通的构件安装到了我们本地的Maven仓库中。这样当我们在其他的Maven项目如果需要用到MavenTest02中的类时,就可以将它作为普通的依赖导入到pom.xml中即可,例如这样:

view plaincopy to clipboardprint?
  1. <dependency>  <groupId>com.wl</groupId>   <artifactId>MavenHelloDemo</artifactId> <version>SNAPSHOT-0.0.1</version></dependency>  

mvn install是所有Maven命令中最常用的命令之一。



自动构建项目&项目骨架



在这之前我们都是手动的去创建目录文件夹,在实际开发中显然是不可取的,实际开发肯定是通过IDE去创建项目,而IDE也无法自动创建,而是间接的调用了Maven的项目构建命令,那么接下来就学习一下构建命令的提供者——Archetypes插件,首先看一下官网的介绍:


可以在官网的这段简介中看到,使用archetype插件可以创建Maven项目,而且一个archetype会提供许多项目模板(骨架),上图中的代码也给出了archetype插件的使用命令和参数名。通常情况下我们使用mvn archetype:generate命令即可,如官方文档中Introdution to Archetypes中介绍的一样,


下面我们在命令行实际操作一下试试看,切换到F:/MavenTest04(空目录)后,输入mvn archetype:generate


如果是第一次运行这个命令则会需要一些时间去自动下载jar包,最后我们可以看到Choose a number or apply filter,Maven的Archetype插件为我们提供了多达1393个项目模板可供选择,我们可以输入模板编号来选择,或者输入过滤器进行过滤,过滤器也很简单,比如我们需要创建web项目,那么输入“web+回车”就会筛选出所有web项目骨架了。当然我们如果不知道选择什么,也可以什么也不输入直接敲回车,就会选择默认的模板,其实就是一个普通java项目了。

接下来我们根据提示需要依次输入版本号、groupId、artifactId、version、package并输入“Y”来确认之后,我们就会在指定的目录下成功创建这个默认骨架的Maven项目了:


如上图所示,我们可以看到在F:/MavenTest04目录下成功创建了maven04-model这个项目:


最后我们直接安装并运行一下这个项目,通过mvn install将我们这个项目编译打包并安装到本地仓库,并通过java命令去运行jar包:


可以看到当我们将目录切换到MavenTest04/maven04-model目录下之后并执行mvn install命令,我们的项目正常编译打包并安装到了我们本地的Maven仓库,那么我们这个项目的jar包应该在target的根目录下,我们尝试执行一下:


成功输出了Hello World!没有任何问题,这就是我们的Archetype插件创建的项目了。

我们还可以通过指定参数名的方式去创建指定的某种骨架的项目,在上面的“How do I make my first Maven Project”的截图中我们可以看到官方提供的几个参数,分别是-DarchetypeGroupId-DgroupId-DartifactId。比如依旧创建上面的那个默认项目的话,我们可以直接运行这个命令:

mvn archetype:generate -DgroupId=com.wl.maven04 -DartifactId=maven04-model -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

这样就避免了我们去选择,而直接创建默认的骨架——maven-archetype-quickstart的项目了。我们在之前运行mvn archetype:generate命令时也看到了这个插件为我们提供的骨架有1393之多,即使我们使用了filter也很难选择,不过没关系,官方给我们提供了几个最常用的骨架以供选择:


如上图所示,可以看到有web project的骨架,simple maven project的骨架等等,我们根据需要自行选择即可,再补充一个很常用的骨架:maven-archetype-webapp,我们在创建web项目的时候更多的应该会选择这个骨架。下面我们就用这个骨架创建一个web项目并在浏览器Hello World!首先创建一个新的目录MavenWebTest,在命令行中切换到该目录并输入命令:


可以看到我们输入了命令并指定参数之后,成功在我们的F:/MavenWebTest目录下创建了mavenweb-model这个web项目,创建完成后我们把这个项目导入到MyEclipse中看一下目录结构(注意MyEclipse的话需要通过maven插件提供的导入来导入maven项目,具体下篇blog会介绍):


可以发现src/main下多了一个webapp目录,而这个目录其实就和我们普通web项目的webroot或webcontent是一样的了,我们的web相关文件(js、jsp、css)等都应该放在这个目录下了,下面再看一下这个自动生成的maven web项目的pom文件吧:

view plaincopy to clipboardprint?
  1. <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.wl.mavenwebtest</groupId>  <artifactId>mavenweb-model</artifactId>  <packaging>war</packaging>  <version>1.0-SNAPSHOT</version>  <name>mavenweb-model Maven Webapp</name>  <url>http://maven.apache.org</url>  <dependencies>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>3.8.1</version>      <scope>test</scope>    </dependency>  </dependencies>  <build>    <finalName>mavenweb-model</finalName>  </build></project>  

注意一下packaging元素,它的值是war,也就说明我们执行mvn package打包项目的时候会在target目录下生成一个war包:


如上图所示,确实如此。我们把这个war包拷贝到tomcat的webapps目录并启动tomcat:


访问一下看看:


没问题,成功显示了Hello World!



总结



本篇blog介绍了仓库的概念、clean和install命令以及maven用于自动构建项目的archetype插件,到目前为止我们都没有使用IDE进行开发,而在实际开发环境中我们一般也不会通过命令行去创建项目,所以下篇blog会陆续学习如何将maven集成到我们的Eclipse和MyEclipse中去,需要什么样的插件,需要如何配置等等

0 0