03maven的核心概念

maven核心概念有

  • 1约定的目录结构
  • 2POM
  • 3坐标
  • 4仓库
  • 5依赖
  • 6生命周期/插件/目标
  • 7聚合
  • 8继承

1约定的目录结构为

spring项目名
src目录存放源码
main目录存放主程序
java目录存放Java源文件
resources目录存放配置文件
test目录存放测试程序
pom.xml文件Maven的核心配置文件

此目录规范了开发结构,提供标准的、统一的项目结构。Eclipse和Idea工程结构不一样,用maven统一结构可以跨开发工具

程序员开发代码普遍认同的观点:约定>配置>编码

2、pom文件3、坐标4、仓库

maven项目的核心是pom.xml。POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等 

<?xml version="1.0" encoding="UTF-8"?>
<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.nie</groupId>
    <artifactId>spring</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>spring</name>
</project>

第一行是xml头,指定了该xml文档的版本和编码方式,

<project>是所有pom.xml的根元素,声明了一些POM相关的命名空间和xsd元素,这些属性不是必须的,但是使用这些属性可以让第三方工具ide帮助我们快速编辑POM

<modelVersion>4.0.0</modelVersion>指定了当前POM模型的版本,对于现阶段maven只能是4.0.4

<groupId><artifactId><version>定义了项目的基本坐标,
groupId定义了项目属于哪个组,一般是域名倒序
artifactId定义了当前项目组中的唯一ID,一般是项目名
version定义了当前版本,SNAPSHOT是快照版本,表示项目还在开发中,是不太稳定的版本

<packaging 定义了打包方式 常见pom,war,jar包

<name>友好的项目名称,不是必须的,但是推荐生命name属性,以方便查阅和交流

仓库已在文章01maven概念与安装_梓源先生的博客-CSDN博客介绍

5依赖

概念:当项目中使用某一jar包A,A.jar使用B.jar的某些API时,项目依赖了A.jar,A.jar依赖了B.jar

引入方式:在pom.xml文件中添加对应的坐标,

<dependencies><!--设置当前所有依赖的jar-->
  <dependency><!-- 设置具体的依赖-->
    <groupId>junit</groupId><!-- 依赖所属群组id-->
    <artifactId>junit</artifactId><!-- 依赖所属项目id-->
    <version>4.11</version><!-- 依赖版本号-->
    <scope>test</scope><!--依赖范围 -->
  </dependency>
</dependencies>

5.1依赖的传递性:

A 依赖 B,B 依赖 C,A 调用C的API,这就是依赖的传递性
        直接传递:在当前项目中通过依赖配置建立的依赖关系
        间接传递:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源

依赖管理
依赖的排除(不需要):排除本项目中不使用的jar包

<exclusions><!--排除依赖,排除所有版本 -->
  <exclusion>
    <groupId>junit</groupId><!-- 依赖所属群组id-->
    <artifactId>junit</artifactId><!-- 依赖所属项目id-->
  </exclusion>
</exclusions>


可选依赖(不透明):让被依赖者不能使用该jar包(私有化)

<groupId>junit</groupId><!-- 依赖所属群组id-->
<artifactId>junit</artifactId><!-- 依赖所属项目id-->
<version>4.11</version><!-- 依赖版本号-->
<scope>test</scope><!--依赖范围 -->
<optional>true</optional><!--可选依赖 true设置私有, -->

5.2依赖的范围:

maven在编译、测试、运行的时候使用不同的classpath,依赖范围就是控制这三种依赖关系

依赖的jar默认任何情况都可使用,通过scope标签设定范围,默认是compile
<scope>test</scope>

scope主代码测试代码打包范例
compilelog4j
testjunit
providedservlet-api
runtimejdbc

servlet-api为什么打包不需要?
是因为打包嵌入tomcat服务器时,tomcat内部有servlet-api的jar包,如果不设置范围,会产生依赖冲突

6生命周期和插件

6.1生命周期

概念:Maven 生命周期为了对所有的构建过程进行抽象和统一,定义了各个构建环节的执行顺序,有了这个清单,Maven 就可以自动化的执行构建命令了。

maven的生命周期是抽象的,实际行为都是又插件来完成的

 Maven 有三套相互独立的生命周期,分别是:

  • Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
  • Default Lifecycle 构建的核心部分,编译,测试,打包,安装,部署等等。
  • Site Lifecycle 生成项目报告,站点,发布站点。

maven拥有三套独立的生命周期

Clean 生命周期

Clean 生命周期一共包含了三个阶段:
pre-clean 执行一些需要在 clean 之前完成的工作
clean 移除所有上一次构建生成的文件
post-clean 执行一些需要在 clean 之后立刻完成的工作
Site 生命周期
pre-site 执行一些需要在生成站点文档之前完成的工作
site 生成项目的站点文档
post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
site-deploy 将生成的站点文档部署到特定的服务器上
这里经常用到的是 site 阶段和 site-deploy 阶段,用以生成和发布 Maven 站点,这是 Maven 相当强大的功能,Manager 比较喜欢,文档及统计数据自动生成
Default 生命周期
Default 生命周期是 Maven 生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里, 只解释一些比较重要和常用的阶段:
validate
generate-sources
process-sources
generate-resources
process-resources 复制并处理资源文件,至目标目录,准备打包。
compile 编译项目的源代码。
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources 复制并处理资源文件,至目标测试目录。
test-compile 编译测试源代码。
process-test-classes
test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
prepare-package
package 接受编译好的代码,打包成可发布的格式,如 JAR
pre-integration-test
integration-test
post-integration-test
verify
install 将包安装至本地仓库,以让其它项目依赖。
deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享或部署到服务器上运行。

命令行和生命周期:maven执行命令的主要作用就是调用maven的生命周期阶段,因为三套生命周期是相互独立的,所以想同时进行多个生命周期就要写组合命令,生命周期的阶段是有前后依赖关系的,也就是说执行了后面的生命周期,前面也会执行
mvn clean:调用clean,实际执行的为clean的生命周期里的pre-clean和clean阶段
mvn clean package:执行了clean的生命周期里的pre-clean和clean阶段和default生命周期从开始到package阶段
mvn clean install:行了clean的生命周期里的pre-clean和clean阶段和default生命周期从开始到install阶段
插件/目标

maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,在maven设计中,实际的任务(如编译源代码)都由插件来完成。这种思想采用了设计模式中的模板方法。既保证了算法的扩展性,又能严格控制算法的整体结果,maven为大多数构建步骤编写了默认插件,当用户有特殊需求的时候,可以配置插件自定义构建行为

maven在核心为一些主要的生命周期阶段内置绑定了很多的插件,当执行该生命周期的命令时,对应的插件目标就会执行相应的任务

内置绑定

default生命周期的内置绑定插件绑定关系及具体任务如下(打包jar类型)

自定义绑定:用户可以根据自己业务需求将某个插件目标绑定到生命周期的某个阶段,

比如tomcat插件

<pluginRepositories>
    <!--阿里云没有tomcat8-maven的插件!!!!!!   -->
    <pluginRepository>
        <id>alfresco</id>
        <url>https://artifacts.alfresco.com/nexus/content/repositories/public/</url>
    </pluginRepository>
</pluginRepositories>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat8-maven-plugin</artifactId>
            <version>3.0-r1655215</version>
            <configuration>
                <port>80</port>
                <uriEncoding>UTF-8</uriEncoding>
                <ignorePackaging>true</ignorePackaging><!--解决tomcat不能启动问题 -->
            </configuration>
        </plugin>
    </plugins>
</build>
插件是支撑和扩展生命周期做的事,
如何理解生命周期和插件:比如,人的生命周期是一生,插件就相当于与人的功能年龄是抽象的概念,吃饭睡觉是实际人做的事,增加人的技能就相当于增加插件

7聚合

作用:一键安装各个工程模块
配置方式:创建一个空模块,打包类型定义为pom
<packaging>pom</packaging>
定义当前模块进行构建操作时关联的其他模块名称
<modules>
<module>../ssm_controller</module>
<module>../ssm_service</module>
<module>../ssm_dao</module>
<module>../ssm_pojo</module>
</modules>
参与聚合操作的模块最终执行顺序与模块间的依赖关系有关,与配置顺序无关

8继承

作用:通过继承可以实现在子工程中沿用父工程中的配置
        maven中的继承与java中的继承类似,在子工程中配置继承关系

使用方式:
        在子工程中声明其父工程坐标与对应的位置

<!--定义该工程的父工程 -->
<parent>
    <groupId>com.nie</groupId>
    <artifactId>ssm</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 父工程的pom文件 -->
    <relativePath>../ssm/pom.xml</relativePath>
</parent>

附加:

maven常见构建命令

        maven命令使用mvn开头,后面添加功能参数,可以一次执行多个命令,使用空格分隔

mvn compile编译
mvn clean清理
mvn test测试
mvn package打包
mvn install安装到本地仓库

<?xml version="1.0" encoding="UTF-8"?>
<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">
  <!--指定pom的模型版本-->
  <modelVersion>4.0.0</modelVersion>
  <!--打包方式,web工程打包为war,java工程打包为jar-->
  <packaging>war</packaging>

  <!--组织id-->
  <groupId>com.nie</groupId>
  <!--项目id-->
  <artifactId>spring</artifactId>
  <!--版本号:release,snapshot-->
  <version>1.0-SNAPSHOT</version>

  <!--设置当前工程的所有依赖-->
  <dependencies>
    <!--具体的依赖-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>
  </dependencies>

  <!--构建-->
  <build>
    <!--设置插件-->
    <plugins>
      <!--具体的插件配置-->
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat8-maven-plugin</artifactId>
        <version>2.1</version>
        <configuration>
          <port>80</port>
          <path>/</path>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值