前言
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 | 主代码 | 测试代码 | 打包 | 范例 |
---|---|---|---|---|
compile | Y | Y | Y | log4j |
test | Y | junit | ||
provided | Y | Y | servlet-api | |
runtime | Y | jdbc |
依赖范围的传递性
- 带有传递依赖范围资源进行传递是,作用范围将受到影响
直接依赖compile | test | provided | runtime | |
---|---|---|---|---|
间接依赖 compile | compile | test | provided | runtime |
test | ||||
provided | ||||
runtime | runtme | test | provided | runtime |
生命周期与插件
生命周期
Maven对项目构建的生命周期分为3套
-
clean:清理工作
- pre-clean clean前操作
- clean 移除上一次构建生成的文件
- post-clean clean后操作
-
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>