Maven教程

开发好几年了,从来没看过/学过Maven,然而却每天都在用,今天抽半天时间补补课。

Maven概念

什么是Maven?

  • Maven 翻译过来就是专家
  • 官网 http://maven.apache.org/
  • 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,但是了解下安装过程还是有必要的。

  1. 安装JDK
  2. 配置JAVA_HOME
  3. 下载Maven解压可用 过程见:http://www.runoob.com/maven/maven-setup.html

POM详解

项目对象模型,Project Object Model ,就是一个xml文件,描述了项目的信息,如果构建、依赖什么的
所以看pom.xml主要就是看一下几个配置:

  • jar包依赖
  • 执行目标
  • 构建profile
  • 版本
  • 项目开发者列表
  • 相关邮件列表

所有的pom文件都必须有的元素:

  • project 工程的根标签
  • modelVersion 模型版本号
  • goupId 工程组的唯一标识,通常为公司或组织域名
  • artifactId 工程的唯一标识,通常是工程名称
  • version 工程的版本号
  • 所有的POM都默认继承自一个父POM(不管你是否显示定义),父POM有一些默认的配置帮助开发者简化开发配置,使用命令mvn help:effective-pom可以查看Super POM 默认配置

 
    
    4.0.0
    
    com.companyname.project-group
 
    
    project
 
    
    1.0

POM的详细配置


    
    
        
        
        
        
        
        
        
        
    
    
    4.0.0
    
    asia.banseon
    
    banseon-maven2
    
    jar
    
    1.0-SNAPSHOT
    
    banseon-maven
    
    http://www.baidu.com/banseon
    
    A maven project to study maven.
    
    
        
        
    
    
    
        
        jira
        
        http://jira.baidu.com/banseon
    
    
    
        
        
        
        
        
        
            
            
                
                
                
                
                
                
                
                
                
                
                
                
Demo [email protected] [email protected] [email protected] http:/hi.baidu.com/banseon/demo/dev/ HELLO WORLD banseon [email protected] Project Manager Architect demo http://hi.baidu.com/banseon No -5 Apache 2 http://www.baidu.com/banseon/LICENSE-2.0.txt repo A business-friendly OSS license scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk) scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk http://svn.baidu.com/banseon demo http://www.baidu.com/banseon ...... ...... Windows XP Windows x86 5.1.2600 mavenVersion 2.0.3 /usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/ /usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/ ...... ...... ...... ...... ...... ...... banseon-repository-proxy banseon-repository-proxy http://192.168.1.169:9999/repository/ default ...... org.apache.maven maven-artifact 3.8.1 jar test spring-core org.springframework true ...... banseon-maven2 banseon maven2 file://${basedir}/target/deploy banseon-maven2 Banseon-maven2 Snapshot Repository scp://svn.baidu.com/banseon:/usr/local/maven-snapshot banseon-site business api website scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web

Maven的构建生命周期

Maven教程_第1张图片
生命周期
  1. 验证 validate 验证项目 验证项目是否正确且所有必须信息是可用的
  2. 编译 compile 执行编译 源代码编译在此阶段完成
  3. 测试 Test 测试 使用适当的单元测试框架(例如JUnit)运行测试。
  4. 包装 package 打包 创建JAR/WAR包如在 pom.xml 中定义提及的包
  5. 检查 verify 检查 对集成测试的结果进行检查,以保证质量达标
  6. 安装 install 安装 安装打包的项目到本地仓库,以供其他项目使用
  7. 部署 deploy 部署 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程

Maven的三个标准生命周期

  • clean 项目清理
  • default或build 项目部署
  • site 项目站点文档构建

Clean 生命周期

当我们执行 mvn post-clean 命令时,Maven 调用 clean 生命周期,它包含以下阶段:

pre-clean:执行一些需要在clean之前完成的工作
clean:移除所有上一次构建生成的文件
post-clean:执行一些需要在clean之后立刻完成的工作
mvn clean 中的 clean 就是上面的 clean,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,mvn clean 等同于 mvn pre-clean clean ,如果我们运行 mvn post-clean ,那么 pre-clean,clean 都会被运行。

Default (Build) 生命周期

这是 Maven 的主要生命周期,被用于构建应用,包括下面的 23 个阶段:

  • validate 检查工程配置是否正确,完成构建过程的所有必要信息是否能够获取到。
  • initialize 初始化构建状态,例如设置属性。
  • generate-sources 生成编译阶段需要包含的任何源码文件。
  • process-sources 处理源代码,例如,过滤任何值(filter any value)。
  • generate-resources 生成工程包中需要包含的资源文件。
  • process-resources 拷贝和处理资源文件到目的目录中,为打包阶段做准备。
  • compile 编译工程源码。
  • process-classes 处理编译生成的文件,例如 Java Class 字节码的加强和优化。
  • generate-test-sources 生成编译阶段需要包含的任何测试源代码。
  • process-test-sources 处理测试源代码,例如,过滤任何值(filter any values)。
  • test-compile 编译测试源代码到测试目的目录。
  • process-test-classes 处理测试代码文件编译后生成的文件。
  • test 使用适当的单元测试框架(例如JUnit)运行测试。
  • prepare-package 在真正打包之前,为准备打包执行任何必要的操作。
    package 获取编译后的代码,并按照可发布的格式进行打包,例如 JAR、WAR 或者 EAR 文件。
  • pre-integration-test 在集成测试执行之前,执行所需的操作。例如,设置所需的环境变量。
  • integration-test 处理和部署必须的工程包到集成测试能够运行的环境中。
  • post-integration-test 在集成测试被执行后执行必要的操作。例如,清理环境。
  • verify 运行检查操作来验证工程包是有效的,并满足质量要求。
  • install 安装工程包到本地仓库中,该仓库可以作为本地其他工程的依赖。
  • deploy 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程。

有一些与 Maven 生命周期相关的重要概念需要说明:
当一个阶段通过 Maven 命令调用时,例如 mvn compile,只有该阶段之前以及包括该阶段在内的所有阶段会被执行。

不同的 maven 目标将根据打包的类型(JAR / WAR / EAR),被绑定到不同的 Maven 生命周期阶段。

在下面的例子中,我们将 maven-antrun-plugin:run 目标添加到 Build 生命周期的一部分阶段中。这样我们可以显示生命周期的文本信息。

Site 生命周期

Maven Site 插件一般用来创建新的报告文档、部署站点等。

  • pre-site:执行一些需要在生成站点文档之前完成的工作
  • site:生成项目的站点文档
  • post-site: 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
  • site-deploy:将生成的站点文档部署到特定的服务器上

这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看。 在下面的例子中,我们将 maven-antrun-plugin:run 目标添加到 Site 生命周期的所有阶段中。这样我们可以显示生命周期的所有文本信息。

Maven使用构建配置文件

pom中可以引用外界的配置文件,达到不同环境(开发、测试、部署)使用不同的构建配置http://www.runoob.com/maven/maven-build-profiles.html

Maven仓库

存放依赖的一个位置/文件夹/仓库

  • 本地仓库
  • 中央仓库
  • 远程仓库

本地仓库

第一次执行maven命令时被创建,maven运行时需要的构件都从本地仓库获取,本地仓库不存在时首先去远程仓库下载到本地仓库,然后再使用。
默认目录%USER_HOME%.m2/repostitory需要修改的话,更改 %M2_HOME%\conf 目录中的 Maven 的 settings.xml 文件中定义另一个路径。


      C:/MyLocalRepository

中央仓库

Maven社区提供的仓库,包含所有的依赖库。

远程仓库

开发者自己搭建的仓库,可以放自己的私有jar包,而不让别人使用,公司内通常做一个自己的远程仓库来加快jar包的下载速度,类似的阿里云仓库就是国内的加速仓库。


      
         companyname.lib1
         http://download.companyname.org/maven2/lib1
      
      
         companyname.lib2
         http://download.companyname.org/maven2/lib2
      
   


Maven依赖搜索顺序

步骤 1 - 在本地仓库中搜索,如果找不到,执行步骤 2,如果找到了则执行其他操作。
步骤 2 - 在中央仓库中搜索,如果找不到,并且有一个或多个远程仓库已经设置,则执行步骤 4,如果找到了则下载到本地仓库中已被将来引用。
步骤 3 - 如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件)。
步骤 4 - 在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库已被将来引用,否则 Maven 将停止处理并抛出错误(无法找到依赖的文件)。

使用阿里云仓库

众所周知,中国政府实行网络闭关锁国政策。Maven访问是不可能的了,使用阿里云的仓库速度会快的多

Maven 阿里云(Aliyun)仓库
Maven 仓库默认在国外, 国内使用难免很慢,我们可以更换为阿里云的仓库。

第一步:修改 maven 根目录下的 conf 文件夹中的 setting.xml 文件,在 mirrors 节点上,添加内容如下:


    
      alimaven
      aliyun maven
      http://maven.aliyun.com/nexus/content/groups/public/
      central        
    

第二步: pom.xml文件里添加:

  
          
            alimaven  
            aliyun maven  
            http://maven.aliyun.com/nexus/content/groups/public/  
              
                true  
              
              
                false  
              
          

Maven插件

Maven的生命周期包含着一系列的阶段,这些phase就相当于Maven提供的接口,实现是由插件来完成的。
插件执行的命令mvn [plugin-name]:[goal-name]
常见插件

Maven教程_第2张图片

不展开细聊:http://www.runoob.com/maven/maven-plugins.html

构建Java项目

构建,测试,持续集成

引入外边依赖

项目模板

项目文档

快照是什么

自动化构建

依赖管理

自动化部署

eclispe/netBeans/idea插件

尝试构建一个Web应用

IntelliJ IDEA 对Maven工具,命令和插件进行了大量封装,基本鼠标操作即可,不需要敲键命令,提高开发速度。可以好好研究下使用方法

你可能感兴趣的:(Maven教程)