Maven项目--继承、聚合、座标、仓库、生命周期

查找依赖信息的网站:http://mvnrepository.com/

一、座标

# Maven中的座标,使用三个向量在仓库中唯一定位一个Maven工程
# 公司或组织域名倒序+项目名
<groupId>com.myonetest.maven</groupId>
# 模块名称
<artifactId>JavaProject01</artifactId>
# 版本,SNAPSHOT 快照的意思,代表会快速迭代;RELEASE 代表稳定版本
<version>0.0.1-SNAPSHOT</version>
# 依赖范围,compile 代表全程参与;test 只参与测试;provided 不参与打包
<scope>compile</scope>

# Maven工程和仓库路径的对应关系
<groupid>org.springframework</groupid>
<artifactid>spring-core</actifactid>
<version>4.0.0.RELEASE</version>
# org/springframework/spring-code/4.0.0.RELEASE/spring-code-4.0.0.RELEASE.jar

二、仓库

# Maven仓库分为本地仓库和远程仓库

# 本地仓库一般包含以下内容
# 1、Maven自身需要的插件
# 2、第三方框架或工具所需要的jar包
# 3、我们自己开发的Maven工程

# 远程仓库一般分为
# 1、中央仓库
# 2、中央仓库镜像
# 3、局域网仓库(可以使用 Nexus 搭建)

三、生命周期/插件

# 插件
# 生命周期的各个阶段只定义了需要执行的任务,各个阶段的任务和插件的目标是相对应的,相似的目标是由
#特定的插件来完成的
# Maven的核心程序定义了抽象的生命周期,生命周期的各个阶段任务都由插件来完成。
# 我们可以把插件目标定义为 Maven 命令。


# 生命周期
# Maven核心程序为了更好的实现自动化构建,不论现在要执行生命周期中的哪一个极端,都会从这个生命周期的最初位置开始执行。(也就是每次都会从头重新开始,比如执行 compile 命令后,再执行 test 命令,因为 test 命令在 compile 命令之后,Maven核心程序会从头开始再执行一遍直到 test)

# mvn clean 生命周期
Clean Lifecycle # 在进行真正的构建前进行清理工作
    pre-clean #执行一些需要在clean之前完成的工作
    clean #移除所有上一次构建生成的文件
    post-clean #执行一些需要在clean之后立刻完成的工作

# mvn site 生命周期
Site Lifecycle #生成项目报告、站点,发布站点
    pre-site #执行一些需要在生成站点文档之前完成的工作
    site #生成项目的站点文档
    post-site #执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
    site-deploy #将生成的站点文档部署到特定的服务器上
# 这里经出用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这是Maven强大的功能,
文档及统计数据自动生成,很好看。

# 默认的生命周期
Default Lifecycle:构建的核心部分,编译、测试、打包、安装,部署等
Default生命周期是Mave生命周期最重要的一个,绝大部分工作都发生在这个里面
    validate
    generate-source
    process-sources
    generate-resources
    process-resource #复制并处理资源文件,至目标目录,准备打包
    compile #编译项目的源代码
    process-classes
    generate-test-sources
    process-test-sources
    generate-test-resources
    process-test-reources #复制并处理资源文件,至目标测试目录。
    test-compile #编译测试源代码
    prcess-test-classes
    test #使用合适的单元测试框架运行测试,这些测试代码不会被打包或部署
    prepare-package
    package #接受编译好的代码,打包成可发布的格式,比如jar
    pre-integration-test
    integration-test
    post-integration-test
    verify
    install #将包安装至本地仓库,以让其它项目依赖
    deploy #将最终的包复制到远程的仓库,以让其它开发人员与项目共享或部署到服务器上运行。

# 三个之间相互独立,可以单独调用,也可以运行mvn clean install site 一起调用。

PS:Maven核心程序只定义了抽象的生命周期,但具体的工作由插件完成,而插件并不包含在Maven核心程序中。 当Maven程序执行命令需要用到一些插件时,Maven核心程序会先到本地仓库找,如果找不到则自动连接外网到中央仓库下载。如果下载失败则构建失败。

四、继承

# 假设场景
# 现在由三个项目A\B\C,都有依赖包junit,版本分别是4.0/4.9/4.2
# 因为并不是必须包,所以依赖范围是 test 
<scope>test</scope>
# 但是 test 的依赖范围不能传递,所以A\B\C三个项目中的版本都不一样

# 需求
# 统一管理各个模块之间的junit依赖版本

# 解决思路
# 将所有的junit依赖版本统一提取到父工程中,子工程声明依赖时不指定版本;以父工程中统一设定。

# 操作步骤
# 1、创建一个新的Maven工程作为父工程,创建项目时 packaging 要选择 pom 方式。
    # 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/xsd/maven-    4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.parent.maven</groupId>
      <artifactId>parent</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>pom</packaging>
    </project>
# 2、在子工程中对声明对父工程的引用
    <!-- 子工程中声明父工程 -->
    <parent>
  	    <groupId>com.parent.maven</groupId>
  	    <artifactId>parent</artifactId>
  	    <version>0.0.1-SNAPSHOT</version>
  	    <relativePath>../parent/pom.xml</relativePath>
    </parent>
# 3、将子工程的座标中与父工程座标中重复的内容删除,会有黄线提示:grouid is duplicate of parent groupid
# 4、在父工程中统一声明JUNIT的依赖(还有一个重点是方便管理)
    <dependencyManagement>
  	    <dependencies>
  		    <dependency>
  			    <groupId>junit</groupId>
  			    <artifactId>junit</artifactId>
  			    <version>4.0</version>
  			    <scope>test</scope>
  		    </dependency>
  	    </dependencies>
    </dependencyManagement>
# 5、在子工程中删除junit依赖的版本号,如果要使用不一致的,也可以不删除。

# PS: 配置继承后,执行安装命令时要先安装父工程。

五、聚合

# 可以实现一键安装各个模块
# 配置方式: 在一个总的聚合工程中配置各个参与聚合的模块
# PS: 可以新建一个Maven工程作为聚合工程,也可以使用刚才实现继承时创建的父工程(一般使用这个)

    <!-- 配置聚合 -->
    <modules>
        <!-- 指定各个子工程的相对路径 -->
  	    <module>../ProjectA</module>
  	    <module>../ProjectB</module>
  	    <module>../ProjectC</module>
    </modules>

# 配置完成直接pom.xml右击run 允许install即可
# 日志中的 reactor build order 会显示先后顺序
# 日志中的 Reactor Summary 会显示各个模块的耗时和成功状态

六、自动部署

平常好像用不上,就先不记录了,核心是使用 cargo 一家专门从事servlet容器启动的组织,org.codehaus.cargo

 

发布了83 篇原创文章 · 获赞 16 · 访问量 8万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章