开发好几年了,从来没看过/学过Maven,然而却每天都在用,今天抽半天时间补补课。
Maven概念
什么是Maven?
- Maven 翻译过来就是专家
- 官网 IT虾米网
- Maven使用POM (Project Object Model)项目对象模型,就是通过一段描述信息管理项目的构建,描述信息为一个xml类型的文件,该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。
- Maven的用途通常有:构建项目,文档生成,报告,依赖管理,SCMS,发布项目,分发项目,邮件管理
- 主要思想:约定大于配置
- 其实就是一个词:标准。规范了Java项目开发的一个标准,标准很重要,每个公司都有自己的标准,那就乱套了
约定项目目录结构
-- 项目目录
--src 项目中的所有资源
--main 存放开发代码和资源
--java 项目的java源代码
--resources 项目的资源文件,源代码之外的其他文件
--test 存放测试代码和资源
--java 项目的测试类和测试代码
--resources 项目的测试资源
--target 打包输出目录
--classes 编译输出目录
--test-classes 测试代码编译输出目录
--generated-sources 自动生成的资源输出目录
--generated-test-sources 测试资源输出目录
--pom.xml 文档对象模型的描述文件
详细解释如下:
- ${basedir} 存放pom.xml和所有的子目录
- ${basedir}/src/main/java 项目的java源代码
- ${basedir}/src/main/resources 项目的资源,比如说property文件,springmvc.xml
- ${basedir}/src/test/java 项目的测试类,比如说Junit代码
- ${basedir}/src/test/resources 测试用用的资源
- ${basedir}/src/main/webapp/WEB-INF web应用文件目录,web项目的信息,比如存放web.xml、本地图片、jsp视图页面
- ${basedir}/target 打包输出目录
- ${basedir}/target/classes 编译输出目录
- ${basedir}/target/test-classes 测试编译输出目录
- Test.java Maven只会自动运行符合该命名规则的测试类
- ~/.m2/repository Maven默认的本地仓库目录位置
开始使用Maven的优势
- 项目设置遵循统一的规则。
- 任意工程中共享。
- 依赖管理包括自动更新。
- 一个庞大且不断增长的库。
- 可扩展,能够轻松编写 Java 或脚本语言的插件。
- 只需很少或不需要额外配置即可即时访问新功能。
- 基于模型的构建 − Maven能够将任意数量的项目构建到预定义的输出类型中,如 JAR,WAR 或基于项目元数据的分发,而不需要在大多数情况下执行任何脚本。
- 项目信息的一致性站点 − 使用与构建过程相同的元数据,Maven 能够生成一个网站或PDF,包括您要添加的任何文档,并添加到关于项目开发状态的标准报告中。
- 发布管理和发布发布 − Maven 将不需要额外的配置,就可以与源代码管理系统(如 Subversion 或 Git)集成,并可以基于某个标签管理项目的发布。它也可以将其发布到分发位置供其他项目使用。Maven能够发布单独的输出,如 JAR,包含其他依赖和文档的归档,或者作为源代码发布。
- 向后兼容性 − 您可以很轻松的从旧版本 Maven 的多个模块移植到 Maven 3 中。
- 子项目使用父项目依赖时,正常情况子项目应该继承父项目依赖,无需使用版本号,
- 并行构建 − 编译的速度能普遍提高20 - 50 %。
- 更好的错误报告 − Maven 改进了错误报告,它为您提供了 Maven wiki 页面的链接,您可以点击链接查看错误的完整描述。
安装
很多集成开发环境默认集成了一个maven,比如IDEA,但是了解下安装过程还是有必要的。
- 安装JDK
- 配置JAVA_HOME
- 下载Maven解压可用 过程见:IT虾米网
POM详解
项目对象模型,Project Object Model ,就是一个xml文件,描述了项目的信息,如果构建、依赖什么的
所以看pom.xml主要就是看一下几个配置:
- jar包依赖
- 执行目标
- 构建profile
- 版本
- 项目开发者列表
- 相关邮件列表
所有的pom文件都必须有的元素:
- project 工程的根标签
- modelVersion 模型版本号
- goupId 工程组的唯一标识,通常为公司或组织域名
- artifactId 工程的唯一标识,通常是工程名称
- version 工程的版本号
- 所有的POM都默认继承自一个父POM(不管你是否显示定义),父POM有一些默认的配置帮助开发者简化开发配置,使用命令
mvn help:effective-pom
可以查看Super POM 默认配置
<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> <!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group --> <groupId>com.companyname.project-group</groupId> <!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 --> <artifactId>project</artifactId> <!-- 版本号 --> <version>1.0</version> </project>
POM的详细配置
<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.0http://maven.apache.org/maven-v4_0_0.xsd"> <!--父项目的坐标。如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值。 坐标包括group ID,artifact ID和 version。 --> <parent> <!--被继承的父项目的构件标识符 --> <artifactId /> <!--被继承的父项目的全球唯一标识符 --> <groupId /> <!--被继承的父项目的版本 --> <version /> <!-- 父项目的pom.xml文件的相对路径。相对路径允许你选择一个不同的路径。默认值是../pom.xml。Maven首先在构建当前项目的地方寻找父项 目的pom,其次在文件系统的这个位置(relativePath位置),然后在本地仓库,最后在远程仓库寻找父项目的pom。 --> <relativePath /> </parent> <!--声明项目描述符遵循哪一个POM模型版本。模型本身的版本很少改变,虽然如此,但它仍然是必不可少的,这是为了当Maven引入了新的特性或者其他模型变更的时候,确保稳定性。 --> <modelVersion>4.0.0</modelVersion> <!--项目的全球唯一标识符,通常使用全限定的包名区分该项目和其他项目。并且构建时生成的路径也是由此生成, 如com.mycompany.app生成的相对路径为:/com/mycompany/app --> <groupId>asia.banseon</groupId> <!-- 构件的标识符,它和group ID一起唯一标识一个构件。换句话说,你不能有两个不同的项目拥有同样的artifact ID和groupID;在某个 特定的group ID下,artifact ID也必须是唯一的。构件是项目产生的或使用的一个东西,Maven为项目产生的构件包括:JARs,源 码,二进制发布和WARs等。 --> <artifactId>banseon-maven2</artifactId> <!--项目产生的构件类型,例如jar、war、ear、pom。插件可以创建他们自己的构件类型,所以前面列的不是全部构件类型 --> <packaging>jar</packaging> <!--项目当前版本,格式为:主版本.次版本.增量版本-限定版本号 --> <version>1.0-SNAPSHOT</version> <!--项目的名称, Maven产生的文档用 --> <name>banseon-maven</name> <!--项目主页的URL, Maven产生的文档用 --> <url>http://www.baidu.com/banseon</url> <!-- 项目的详细描述, Maven 产生的文档用。 当这个元素能够用HTML格式描述时(例如,CDATA中的文本会被解析器忽略,就可以包含HTML标 签), 不鼓励使用纯文本描述。如果你需要修改产生的web站点的索引页面,你应该修改你自己的索引页文件,而不是调整这里的文档。 --> <description>A maven project to study maven.</description> <!--描述了这个项目构建环境中的前提条件。 --> <prerequisites> <!--构建该项目或使用该插件所需要的Maven的最低版本 --> <maven /> </prerequisites> <!--项目的问题管理系统(Bugzilla, Jira, Scarab,或任何你喜欢的问题管理系统)的名称和URL,本例为 jira --> <issueManagement> <!--问题管理系统(例如jira)的名字, --> <system>jira</system> <!--该项目使用的问题管理系统的URL --> <url>http://jira.baidu.com/banseon</url> </issueManagement> <!--项目持续集成信息 --> <ciManagement> <!--持续集成系统的名字,例如continuum --> <system /> <!--该项目使用的持续集成系统的URL(如果持续集成系统有web接口的话)。 --> <url /> <!--构建完成时,需要通知的开发者/用户的配置项。包括被通知者信息和通知条件(错误,失败,成功,警告) --> <notifiers> <!--配置一种方式,当构建中断时,以该方式通知用户/开发者 --> <notifier> <!--传送通知的途径 --> <type /> <!--发生错误时是否通知 --> <sendOnError /> <!--构建失败时是否通知 --> <sendOnFailure /> <!--构建成功时是否通知 --> <sendOnSuccess /> <!--发生警告时是否通知 --> <sendOnWarning /> <!--不赞成使用。通知发送到哪里 --> <address /> <!--扩展配置项 --> <configuration /> </notifier> </notifiers> </ciManagement> <!--项目创建年份,4位数字。当产生版权信息时需要使用这个值。 --> <inceptionYear /> <!--项目相关邮件列表信息 --> <mailingLists> <!--该元素描述了项目相关的所有邮件列表。自动产生的网站引用这些信息。 -->