Maven总结

前言

        Maven是一个非常好的项目管理工具,该博客将总结一下maven的相关知识.

知识点梳理

依赖管理

依赖传递

依赖具有传递性
	直接依赖:当前项目中通过依赖配置建立的依赖关系
	简介依赖:被依赖的资源如果依赖其他资源,称当前项目简介依赖其他资源

依赖传递的冲突问题

  • 路径优先:当依赖中出现相同的资源时,层级越来越深,优先级越来越低,层级越浅,优先级越高,即项目的直接依赖为一度,项目的直接依赖的直接依赖为二度一次类推,度数越大,优先级越小
  • 声明优先:当资源在相同的资源时,配置顺序靠前的覆盖配置顺序靠后的
  • 特殊优先:当同级配置了相同的资源的不同版本,后配置覆盖前配置

可选依赖

可选依赖是指对外隐藏当前所依赖的资源–不透明

  • 在你要隐藏的资源的<dependency>中配置<optional>true</optional>默认为false

     即:不让人在引用你的项目资源时看到你隐藏的资源,只对自己创建的项目有效
    

排除依赖

排除依赖指主动断开依赖资源,被排除的组原无需指定版本–不需要
- 在不想间接引用某资源的<dependency>中配置<exclusions>并配置具体排除依赖

	实例:
		<dependency>
           <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <exclusions>
                <exclusion>
                    <groupId>org.hamcrest</groupId>
                    <artifactId>hamcrest-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
即:不想在引用某资源时间接引用某资源

依赖范围

  • 依赖的jar情况默认可以在任何位置使用,可以使用<scope>标签设定其作用范围
  • 作用范围
    • 主程序范围优先(main文件夹范围内)
    • 测试程序范围有效(test文件范围内)
    • 是否参与打包(package指令范围内)
scope主代码测试代码打包范例
compileYYYlog4j
testYjunit
providedYYservlet-api
runtimeYjdbc

依赖范围的传递性

  • 带有传递依赖范围资源进行传递是,作用范围将受到影响
直接依赖compiletestprovidedruntime
间接依赖 compilecompiletestprovidedruntime
test
provided
runtimeruntmetestprovidedruntime

生命周期与插件

生命周期

Maven对项目构建的生命周期分为3套

  • clean:清理工作

    • pre-clean    clean前操作
    • clean      移除上一次构建生成的文件
    • post-clean    clean后操作
  • default:核心工作,例如编译,测试,打包部署等
    default构建生命周期

  • site:产生报告,发布站点等

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

插件

执行到生命周期相应阶段就执行相应的插件

  • 插件与声明周期内阶段进行绑定,在执行对应生命周期时执行对应的插件功能
  • 默认maven在个生命周期上有预设的功能
  • 通过插件可以自定义其他功能
<!--实例-->
	<plugin>
	    <groupId>org.apache.maven.plugins</groupId>
	      <artifactId>maven-sources-plugin</artifactId>
	      <version>2.2.1</version>
	      <!--executions代表执行-->
	      <executions>
	          <execution>
	              <goals><!--插件不一定有-->
	                  <goal>gar</goal>
	                  <goal>test-gar</goal>
	              </goals>
	              <!--phase定义在执行到那个生命周期阶段执行-->
	              <phase>generate-test-resources</phase><!--执行test时执行-->
	          </execution>
	      </executions>
	  </plugin>

分模块开发与设计

    上面的项目找不到了,只能再总结一下,下面知识点都在press_release_system项目都在press_release_system项目中,已使用Git上传到码云上了,有机会写个Typora文档上传上去,详细说明一下项目

<?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.muyu</groupId>
    <artifactId>press</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--定义该工程用于进行构建管理-->
    <packaging>pom</packaging>

    <!--定义管理-工程列表-->
    <modules>
        <module>../press_controller</module>
        <module>../press_dao</module>
        <module>../press_pojo</module>
        <module>../press_service</module>
    </modules>
    <!--
    一、聚合:
        问题:在我们分模块后,并相互依赖,但当只有一个模块更新后,可能会出现问题,
        作用:用于快速构建maven工程,一次性构建多个项目/模块
        过程:
            1.创建一个空模块,打包方式定义为pom
            2.定义当前进行构建操作时关联的其他模块名称
                * 配置内容为相对路径方式
                * 如果为线性依赖:执行顺序与配置顺序无关
                * 如果为非线性依赖:执行顺序与配置顺有关
            3.执行空模块的相应操作,关联的模块则会一起操作
    二、继承:
        问题:分模块后,所使用的组件版本可能因为多人开发导致不同
        作用:可以实现子工程中沿用父工程配置
        过程:
            1.创建一个空模块,打包方式定义为pom(可与聚合是一个)
            2.定义<dependencyManagement>里放依赖门,在<build>定义<pluginManagement>里放插件门
            3.在要继承的模块中定义父模块
                <parent>
                    <groupId>com.muyu</groupId>
                    <artifactId>press</artifactId>
                    <version>1.0-SNAPSHOT</version>
                    //这个为与父工程的pom.xml的相对路径
                    <relativePath>../press/pom.xml</relativePath>
                </parent>
                子模块工程id<groupId>与版本号<version>应该与父工程一样,所以可以不写
                    版本号可以自己定义版本
            4.定义父模块的项目可以不用在定义版本号及其他设置
                其他设置也可以另定义,比如Junit中<scope>test</scope>
    三、属性
        问题:多个相关的版本要保持一致,但单独配置又很难管理
        过程:
            1.定义属性标签<properties>
            2.在标签中定义自己的属性标签,内容为版本值
            3.使用${属性标签名}进行使用
        类别:
            1.自定义属性
                上者
            2.内置属性
                ${[project.]version}:版本号
                ${basedir}
            3.Setting属性{单词解释:repository,储存库(dao层注解)}
                ${settings.localRepository}:使用Maven配置文件setting.xml中的标签属性,用于动态配置
            4.Java系统属性
                cmd->mvn help:system 上半区
            5.环境变量属性${env.***}
                cmd->mvn help:system 下半区
    -->
    <!--
    四、版本管理
        工程版本
            SNAPSHOT(快照版本)
            RELEASE(发布版本)
    -->
    <!--定义自定义属性-->
    <properties>
        <spring.version>5.1.9.RELEASE</spring.version>
        <!--设置配置资源的属性-->
    </properties>

    <!--声明此处进行依赖管理-->
    <dependencyManagement>
        <!--继承所有到的所有管控依赖-->
        <dependencies>

            <dependency>
                <groupId>com.muyu</groupId>
                <artifactId>press_pojo</artifactId>
                <version>${version}</version>
            </dependency>
            <dependency>
                <groupId>com.muyu</groupId>
                <artifactId>press_dao</artifactId>
                <version>${version}</version>
            </dependency>
            <dependency>
                <groupId>com.muyu</groupId>
                <artifactId>press_service</artifactId>
                <version>${version}</version>
            </dependency>

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${spring.version}</version>
            </dependency>

            <dependency><!--spring-web封装了监听器-->
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>${spring.version}</version>
            </dependency>

            <!--spring-aop包在spring-context中有了-->
            <dependency><!--aop相关-->
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>1.8.4</version>
            </dependency>
            <dependency>
                <!--配置平台管理事务
                 例如Dao层技术是jdbc或者mybatis时:org.springframework.jdbc.datasource.DataSourceTransactionManager-->
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency><!--事务-->
                <groupId>org.springframework</groupId>
                <artifactId>spring-tx</artifactId>
                <version>${spring.version}</version>
            </dependency>

            <!--thymeleaf模板引擎,好像可以完全替换jsp-->
            <dependency>
                <groupId>org.thymeleaf</groupId>
                <artifactId>thymeleaf-spring5</artifactId>
                <version>3.0.11.RELEASE</version>
            </dependency>

            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.32</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.10</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.4.6</version>
            </dependency>
            <dependency><!--mybatis整合spring-->
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
                <version>1.3.1</version>
            </dependency>

            <!--PageHelper插件-->
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper</artifactId>
                <version>3.7.5</version>
            </dependency>
            <!--分页助手的解析器-->
            <dependency>
                <groupId>com.github.jsqlparser</groupId>
                <artifactId>jsqlparser</artifactId>
                <version>0.9.1</version>
            </dependency>


            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>3.0.1</version>
            </dependency>
            <dependency>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>javax.servlet.jsp-api</artifactId>
                <version>2.2.1</version>
            </dependency>
            <dependency>
                <groupId>jstl</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>

            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
                <version>2.9.0</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.9.0</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>2.9.0</version>
            </dependency>

            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
            <dependency><!--spring集成Junit-->
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>1.7.7</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>

            <!--jedis缓存-->
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>2.7.0</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.mortbay.jetty</groupId>
                    <artifactId>maven-jetty-plugin</artifactId>
                    <version>6.1.25</version>
                    <configuration>
                        <!--热部署,mei10秒扫描一次-->
                        <!--          <scanIntervalseconds>10</scanIntervalseconds>-->
                        <!--可指定当前项目的站点名-->
                        <contextPath>/press</contextPath>
                        <connectors>
                            <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
                                <port>9093</port><!--设置启动的端口号-->
                            </connector>
                        </connectors>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.tomcat.maven</groupId>
                    <artifactId>tomcat7-maven-plugin</artifactId>
                    <version>2.2</version>
                    <configuration>
                        <port>80</port>
                        <path>/press</path>
                        <uriEncoding>UTF-8</uriEncoding>
                        <server>tomcat7</server>
                        <update>true</update>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.19.1</version>
                    <configuration>
                        <forkMode>once</forkMode>
                        <argLine>-Dfile.encoding=UTF-8</argLine>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-sources-plugin</artifactId>
                    <version>2.2.1</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>gar</goal>
                                <goal>test-gar</goal>
                            </goals>
                            <!--phase定义在执行到那个阶段执行-->
                            <phase>generate-test-resources</phase>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

</project>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值