Maven学习笔记

来源:互联网 发布:wp10桌面软件 编辑:程序博客网 时间:2024/05/17 02:38

阅读DW上Maven2简介 http://www.ibm.com/developerworks/cn/education/java/j-mavenv2/index.html
  • 探究了 Maven 2 设计背后的模型和动机
  • 理解了所有重要的 Maven POM
  • 观察了 Maven 存储库和坐标系统是如何简化复杂依赖项管理的
  • 在快捷简单的项目中使用了 Maven 2
  • 了解了 Maven 2 如何有助于大型多模块项目
  • 直接观察了 Maven 2 如何便利您的日常项目构建和源码/二进制管理活动 
-----------------------------------------------------------------------------------------------------------华丽丽------------------------------------------------------------------------------------


1  存储库: 

项目依赖项存储在存储库服务器(在 Maven 术语中简单地称之为存储库)上。要成功的解析依赖项,需要从包含该工件的存储库里找到所需的依赖性工件。

 

基于 POM 中的项目依赖项信息,该依赖项解析器试图以下列方式解析依赖项:

1.检查本地存储库中的依赖项。

2.检查远程存储库列表中的依赖项。

3.如果前两步失败,则报告一个错误。

 

Maven 2 本地存储库是磁盘上的一个目录,通常位于HomeDirectory/.m2/repository。这个库扮演着高性能本地缓存的角色,存储着在依赖项解析过程中下载的工件。远程存储库要通过网络访问。可以在 settings.xml 配置文件中维护一个远程存储库列表以备使用。 

默认情况下,第二步中所涉及的第一个远程存储库是一个能在全球访问的集中式 Maven 2 存储库,它包含了最流行的开源项目的一些工件。在内部开发中,可以设置额外的远程存储库来包含从内部开发模块中发布的工件。可以使用 settings.xml 中的 <repositories> 元素来配置这些额外的远程存储库。 

2   坐标

Maven 坐标是一组可以惟一标识工件的三元组值。坐标包含了下列三条信息:

 

组 ID:代表制造该工件的实体或组织。例如,com.ibm.devworks 就是一个组 ID。

工件 ID:实际的工件的名称。例如,主体类名为 OpsImp 的项目也许会用 OpsImp 作为其工件 ID。

版本:该工件的版本号。

 

[html] view plaincopy
  1. <dependencies>  
  2.   <dependency>  
  3.      <groupId>com.ibm.devworks</groupId>  
  4.      <artifactId>OpsImp</artifactId>  
  5.      <version>1.0-SNAPSHOT</version>  
  6.   </dependency>  
  7. </dependencies>  

 

特别限定词 SNAPSHOT 告诉 Maven 2:该项目或模块还处于开发状态中,它应该获取最新版的可用工件。

 Maven 维护了一个工件的 POM 文件,同时也为该工件和其存储库中的 POM 维护了检验和散列。

 

3  插件与 Mojo 

插件是适应 Maven 的插件框架的软件模块。现在,可以使用 Java、Ant 或 Beanshell 来创建自定义插件。

 

插件中的每个任务称作一个Mojo。有时,插件也被视为一套相关的 Mojo

 

Maven 2 是预先打包好的,以便于下载,它和许多常用插件一起使用。大多数典型开发任务不需要使用额外插件。

 

4  Maven项目流程

. Maven 2 默认生命周期的各阶段

生命周期阶段         描述

验证         确保当前配置和 POM 的内容是有效的。这包含对pom.xml 文件树的验证。

初始化    在执行构建生命周期的主任务之前可以进行初始化。

生成源码        代码生成器可以开始生成在以后阶段中处理或编译的源代码。

处理源码         提供解析、修改和转换源码。常规源码和生成的源码都可以在这里处理。

生成资源         可以生成非源码资源。通常包括元数据文件和配置文件。

处理资源         处理非源码资源。修改、转换和重定位资源都能在这阶段发生。

编译         编译源码。编译过的类被放到目标目录树中。

处理类     处理类文件转换和增强步骤。字节码交织器和常用工具常在这一阶段操作。

生成测试源码       mojo 可以生成要操作的单元测试代码。

处理测试源码         在编译前对测试源码执行任何必要的处理。在这一阶段,可以修改、转换或复制源代码。

生成测试资源         允许生成与测试相关的(非源码)资源。

处理测试资源         可以处理、转换和重新定位与测试相关的资源。

测试编译         编译单元测试的源码。

测试         运行编译过的单元测试并累计结果。

打包         将可执行的二进制文件打包到一个分布式归档文件中,如 JAR 或 WAR。

前集成测试     准备集成测试。这种情况下的集成测试是指在一个受到一定控制的模拟的真实部署环境中测试代码。这一步能将归档文件部署到一个服务器上执行。

集成测试        执行真正的集成测试。

后集成测试     解除集成测试准备。这一步涉及测试环境重置或重新初始化。

检验         检验可部署归档的有效性和完整性。过了这个阶段,将安装该归档。

安装         将该归档添加到本地 Maven 目录。这一步让其他可能依赖该归档的模块可以使用它。

部署         将该归档添加到远程 Maven 目录。这一步让这个工件能为更多的人所用。

  

5       Maven指令

5.1    创建Maven项目

mvn archetype:create

 

要创建能用 Maven 构建的简单 Java 项目所需的一切,可以使用 Archetype 插件,它是 Maven 2 中的标准插件。不同于构建阶段插件,Archetype 在 Maven 项目构建生命周期之外运行,用于创建Maven 项目。

在您想要包含 NumOps 项目的目录中执行下列命令

mvn archetype:create-DarchetypeGroupId=org.apache.maven.archetypes

 -DgroupId=com.ibm.devworks -DartifactId=NumOps

 

5.2    构建生命周期

mvn compile

编译。

 

这个命令使 Maven 2 引擎从构建生命周期一直运行到编译阶段,并执行相应的 mojo。您应该看到构建成功的报告,如果这是第一次运行,那会花点时间,因为一些依赖项需要经过 Internet 从中央存储库下载。

 

mvn test

命令运行所有的 mojo 一直到测试阶段。

 

mvn install

将打包的模块安装到本地目录中。这使得任何依赖于它的模块可以不访问源代码就能解析依赖项。

6       pom.xml 文件

6.1    多模块项目

6.1.1      顶层的 pom.xml 文件

[html] view plaincopy
  1. <span style="font-weight: normal;"><project xmlns="http://maven.apache.org/POM/4.0.0"  
  2.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0  
  4.   http://maven.apache.org/maven-v4_0_0.xsd">  
  5.  <modelVersion>4.0.0</modelVersion>  
  6.  <groupId>com.ibm.devworks</groupId>  
  7.  </span><artifactId>mavenex2</artifactId>  
  8.  <packaging>pom</packaging><span style="font-weight: normal;">  
  9.  <version>1.0-SNAPSHOT</version>  
  10.   <name>Maven Example2</name>  
  11.   <url>http://maven.apache.org</url>  
  12. </span><modules>  
  13.  <module>NumOps</module>  
  14.  <module>OpsImp</module>  
  15. </modules><span style="font-weight: normal;">  
  16.    <build>  
  17.     <plugins>  
  18.       <plugin>  
  19.        <artifactId>maven-compiler-plugin</artifactId>    
  20.         <configuration>  
  21.          <source>1.5</source>  
  22.           <target>1.5</target>  
  23.         </configuration>  
  24.       </plugin>  
  25.     </plugins>  
  26.   </build>  
  27. </span><dependencyManagement>  
  28.                <dependencies>  
  29.                      <dependency>  
  30.                         <groupId>com.ibm.devworks</groupId>  
  31.                         <artifactId>OpsImp</artifactId>  
  32.                         <version>${project.version}</version>  
  33.                       </dependency>  
  34.                  </dependencies>  
  35.   </dependencyManagement><span style="font-weight: normal;">  
  36.   <dependencies>  
  37.     <dependency>  
  38.      <groupId>junit</groupId>  
  39.      <artifactId>junit</artifactId>  
  40.      <version>3.8.1</version>  
  41.      <scope>test</scope>  
  42.     </dependency>  
  43.   </dependencies>  
  44. </project></span>  

 

新代码以粗体突出显示。首先,这个主项目的工件 ID 是 mavenex2,其打包类型是 pom。这向 Maven 2 传递出这样的信号:这是一个多模块项目。

随后,<modules> 标记指定组成此项目的两个模块:NumOps 和 OpsImp。

这个主项目的子模块能从这个 pom.xml 文件中继承属性。说得更具体一点,这些子模块都不需要将 JUnit 声明为一个依赖项,即使它们都包含单元测试。这是因为它们继承了顶层定义的 JUnit 依赖项。

<dependencyManagement> 标记不指定此模块依赖的依赖项。相反,它主要由子模块使用。子模块能指定 <dependencyManagement> 标记中任何条目的依赖项,而无需指定具体的版本号。当项目树更改依赖项的版本号时,这很有用,可以使需编辑的条目数目最小化。在本例中,OpsImp 项目的版本号是使用 ${project.version} 指定的。在执行 Maven 时,这是一个会被相应值所填充的参数。

 

6.1.2      子模块pom.xml 文件

[html] view plaincopy
  1.     <span style="font-weight: normal;"><project xmlns="http://maven.apache.org/POM/4.0.0"  
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0   
  4.   http://maven.apache.org/maven-v4_0_0.xsd">  
  5.  </span> <parent>  
  6.    <groupId>com.ibm.devworks</groupId>  
  7.     <artifactId>mavenex2</artifactId>  
  8.     <version>1.0-SNAPSHOT</version>  
  9.    </parent><span style="font-weight: normal;">  
  10.   <modelVersion>4.0.0</modelVersion>  
  11.   <artifactId>NumOps</artifactId>  
  12.   <packaging>jar</packaging>  
  13.   </span><dependencies>  
  14.                         <dependency>  
  15.                           <groupId>com.ibm.devworks</groupId>  
  16.                           <artifactId>OpsImp</artifactId>  
  17.                          </dependency>  
  18.                       </dependencies><span style="font-weight: normal;">  
  19. </project>  
  20. </span>  


元素指定此模块所继承自的主POM。从父模块中继承极大地简化了这个 pom.xml。只需要覆盖该工件 ID 并打包。此模块继承了其父模块的依赖项:JUnit 模块。

 

POM 中将 OpsImp 项目指定为一个依赖项。请注意,在这个依赖项中没有指定任何版本号。在它的父项目的 <dependencyManagement> 元素里已经指定了首选的版本号。

 

6.1.3      Super POM

只要从一个高层 POM 中继承,您总能在了解了所有继承元素后发现相对应的 pom.xml 是什么样。显示“effective POM”的命令是 mvn help:effective-pom。您将看到一些您还没有指定的元素。这些都是从 Super POM 中继承的。每个项目 pom.xml 都从 Maven 内嵌的 Super POM 中隐式地继承。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 酷派手机的信息文件夹不见了怎么办 酷派手机开机卡在开机界面怎么办 魅蓝拨号键老是闪退怎么办 手机上浏览器搜索时字在右边怎么办 酷比魔方平板开不开机怎么办 红米手机摔了有一角黑屏了怎么办 红米手机刷机黑屏打不开怎么办 魅蓝x一打电话就黑屏怎么办 红米手机黑屏打不开怎么办充电发烫 小米手机打电话来是关机的怎么办 红米手机打电话自动灭屏怎么办 红米5s手机白屏怎么办 红米手机黑屏开不了机怎么办 红米note开机键不灵了怎么办 红米2忘记锁屏密码怎么办 红米1手机忘记锁屏密码怎么办 红米4x关不了机怎么办 红米4a手机屏幕黑屏打不开怎么办 红米手机为什么开不了机怎么办 红米note手机刷机失败怎么办 金立手机来电屏幕不亮怎么办 小米5s桌面相机图标不见了怎么办 小米手机锁屏密码忘了怎么办? 小米平板电脑锁屏密码忘了怎么办 小米手机进水了黑屏了嗡嗡响怎么办 华为诺娃2手机声音小怎么办 华为平板锁屏密码忘记了怎么办 华为麦芒6手机按键摔坏了怎么办 定频空调加错了佛里昂怎么办 定频空调外机噪音大怎么办 老美的定频空调出现p0怎么办 华为揽阅m2青春版卡顿了怎么办 华为揽阅M2青春版发热卡顿怎么办 全民突击网速不给力经常掉线怎么办 华为手机微信视频黑屏了怎么办 相机拍照后找不到拍的照片怎么办 苹果手机下载软件不被信任怎么办 苹果x手机下载软件不受信任怎么办 华为畅享7plus主板坏了怎么办 华为手机手机主板坏了没备份怎么办 华为手机一年内主板坏了怎么办