JavaWeb(7)——Maven学习
来源:互联网 发布:德比鞋 搭配 知乎 编辑:程序博客网 时间:2024/06/14 03:59
开发过程中经常使用Maven,以为掌握了Maven,知道自己要写一个小项目,才意识根本不会maven。重新系统的学习Maven。
Maven的基本概念
Maven是一个方便程序员创建,配置,发布,部署项目的管理工具。
约定优于配置
Maven采用“约定优于配置”的策略(这一点最具代表性的是Ruby on Rails)。
所谓约定由于配置,就是不需要对每一个文件写配置来说明彼此间的关系,而是规定不同作用的文件存放的位置,常见的约定:
源代码应存放于: ${basedir}/src/main/java子源代码存放在:${basedir}/src/main/resources测试代码存放在:${basedir}/src/test编译生成class存在:${basedir}/target/classes项目产生jar文件存放在: ${basedir}/target
遵守这样的规定可以让开发变得轻松,当然也可以修改约定使它符合自己的习惯。
于是我就明白之前用IDE创建Maven项目为什么会有一各环节要选定模板,选定的实际上就是一组约定。
我们经常使用的约定模板通过maven插件来设定的,这又涉及到Maven的又一个重要概念——插件。
插件
maven的强大是因为它的插件,有的插件可以用来确定项目“约定”,有的用于下载依赖库,有的用于比编译,测试,发布等等。插件会根据需要自动下载,因此maven使用过程中经常会下载东西,一个大项目的首次编译,往往要等很久来下载各种插件和依赖库。
使用Maven的archetype插件创建一个maven约定结构的项目:
mvn archetype:generate -DinteractiveMode=false -DgroupId=org.wayblink -DartifactId=mavenQs -Dpackage=org.wayblink.mavenqs
稍等一下,可能会下载一些东西,然后就会创建一个mavenQs的项目,项目的目录结构:
.├── pom.xml└── src ├── main │ └── java │ └── org │ └── wayblink │ └── mavenqs │ └── App.java └── test └── java └── org └── wayblink └── mavenqs └── AppTest.java
会发现一个符合经典约定的项目创建了,在项目的根目录,我们看到了一个文件,pom.xml,这是陌生的新事物,它是Maven中非常重要的东西,我们接下来就讲它,而插件的作用会在后续再深入理解。
pom.xml
pom.xml称为项目对象模型(project object model)描述文件,描述了项目的一系列信息。
打开上面创建项目的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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.wayblink</groupId> <artifactId>mavenQs</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>mavenQs</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></project>
我们看到了上面在创建项目命令行中定义的项目信息:<groupId>org.wayblink</groupId>
,<artifactId>mavenQs</artifactId>
,<name>mavenQs</name>
,可知pom文件保存了项目的许多基本信息。pom.xml包含着丰富的信息,在下面会详细描述。
Maven生命周期
项目的开发经历着类似的流程,从开发到测试,到打包,到发布,Maven作为一个项目管理工具也就应运而生适应于此的生命周期。
Maven的包括三个基本生命周期:
cleandefaultsite
clean生命周期用于构建项目之前的清理工作,包含:
pre-cleancleanpost-clean
default生命轴器包含项目构建的核心,包括:
compile 编译项目test 单元测试package 项目打包install 安装到本地仓库deploy 部署到远程仓库
site生命周期用于生成项目报告站点,发布站点:
pre-sitesitepost-sitesite-deploy
对于每一个生命后期,不同的阶段遵从着严格的顺序,命令指定要执行到某一环节,它前面的环节也会执行。例如:
mvn clean package
就会分别顺序执行到pre-clean
,clean
和compile
,test
,package
。
Maven资源库
Maven的资源库Repository保存着各种插件的第三方依赖库。在运行maven进场会发现它在下载东西,实际上就是从公共的Repository下载需要的插件或者依赖库到本地。
资源科按照存放位置分为三种:
1,本地资源库
从远程或中央资源库下载到本地的插件和依赖库,存放在本地的一个文件夹中,可以通过Maven安装目录的conf/settings.xml或者用户home目录下的m2/settings.xml中的localRepository元素进行设置。
2,远程资源库
远程资源库由公司或者团队集中进行维护。
3,中央资源库
中央资源库也可以成为官方资源库,有Maven官方维护,方便Maven用户使用,几乎所有的开源插件和第三方库都可以在官方库中找到。但官方库下载往往是比较慢的,一个大项目的第一次build往往需要花费很长时间。
详解POM.xml
坐标
返回上面的pom.xml示例,会发现项目的几个描述元素
<groupId>org.wayblink</groupId> <artifactId>mavenQs</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version>
下面的junit也有类似的属性
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope></dependency>
这其中,groupId,artifactId,packaging,version被称为Maven坐标,坐标可以唯一标定项目。有了这个标记就知道它是有那个组织开发的什么项目,项目的编号是多少,格式是什么。以这个项目为例,使用maven package
命令打包项目后,会产生mavenQs-1.0-SNAPSHOT.jar的包,可见与坐标是对应的。同理junit的坐标实际上就是在项目中引入了junit-3.8.1.jar的依赖。至于什么是依赖,见下小节。
依赖管理
pom.xml中最关键的功能就是以来管理,也就是<dependencies></dependencies>
的部分。
项目所需要的依赖豆油dependencis来管理,dependencies标签包含着多个dependency标签,每一个对应着一个依赖包。
dependency标签还包含着以下标签:
<groupId>组织ID<artifactId>项目名<version>项目版本号<scope>依赖库作弄范围<type>依赖库类型,默认是jar<optional>指定该依赖库是否为可选<classifier>JDK版本号<exclusions>用于排除依赖
其中,scope可以取以下值:
compile 默认范围,编译测试打包时需要provided 表示容器会在runtime时提供runtime 表示编译时不需要,但在测试和运行时需要,最终打包会打包进去test 只用于测试阶段system 与provided类似,但要求该jar是系统自带的import 继承父pom文件中使用dependencyManagement配置的依赖
需要说明的是Maven依赖具有传递性,项目依赖于a.jar,a.jar又依赖于b.jar,不用显示声明项目依赖于b.jar,Maven会自动管理这种依赖传递。
其他元素
pom.xml除了dependencies还有其他元素,如:
buildreportinglicensesorganizationdevelopers......
这些详细使用参看文档,如果之后遇到,再做学习。
- JavaWeb(7)——Maven学习
- eclipse+maven构建web项目——HelloWorld,从构建项目开始学习JavaWeb
- Javaweb学习笔记7—JDBC技术
- JavaWeb学习——Session
- javaweb之Maven项目管理工具学习
- javaweb学习(一)Maven的安装
- JavaWeb学习总结(一)——JavaWeb开发入门
- JavaWeb学习总结(一)——JavaWeb开发入门
- JavaWeb学习总结(一)——JavaWeb开发入门
- JavaWeb学习总结(一)——JavaWeb开发入门
- JavaWeb学习总结(一)——JavaWeb开发入门
- JavaWeb学习总结(一)——JavaWeb开发入门
- JavaWeb学习总结(一)——JavaWeb开发入门
- JavaWeb学习总结(一)——JavaWeb开发入门
- JavaWeb学习总结(一)——JavaWeb开发入门
- JavaWeb学习总结(一)——JavaWeb开发入门
- JavaWeb学习总结(一)——JavaWeb开发入门
- JavaWeb学习总结(一)——JavaWeb开发入门
- OpenCV 从浮点型数据的视差图中分割并滤除小的斑块
- 【maven&&tomcat】maven自动部署项目到tomcat
- 最短路径:弗洛伊德算法
- struts2基本配置
- binwalk的extract出来的内容
- JavaWeb(7)——Maven学习
- 具名函数和匿名函数
- 链表-leetcode 86 Partition List
- RedMonk 6 月编程语言排行:JS:第一 Java:第二
- JavaWeb学习总结(十一)——使用Cookie进行会话管理
- 史上最详细Linux 虚拟文件系统sysfs之属性文件attribute 整理(二)
- jQuery根据radio来控制texteara
- 子集
- n&(n-1)的妙用