概要:

  1. maven 基本概念
  2. maven 核心配置

一、maven  安装与核心概念

概要:

  1. maven 安装
  2. maven 编译(compile)
  3. 执行测试用例(test)
  4. maven 打包
  5. maven  依懒管理

1、安装

  1. 官网下载 Maven (https://maven.apache.org/
  2. 解压指定目录
  3. 配置环境变量
  4. 检查安装是否成功 (mvn -version)

2、maven 编译

maven 编译过程演示

l  创建maven项目。

l  创建src 文件

l  编写 pom 文件

l  执行编译命令

请注意,在上述配置和命令当中,我们并没有指定源码文件在哪里?最后编译到哪里去?在这里

maven 采用了约定的方式从指项目结构中获取源码与资源文件进行编译打包。

  1. 主源码文件:${project}/src/main/java
  2. 主资源文件:${project}/src/main/resources
  3. 测试源码文件:${project}/src/test/java
  4. 测试资源文件:${project}/src/test/resources

3、Maven打包

maven 打包演示

#mvn 打包命令

mvn package

4、maven 单元测试演示

l  编写测试类

l  执行测试命令

执行完指令发现没有执行我们的测试方法,这是为何?原因在于maven 当中的测试类又做了约定,约定必须是Test开头的类名与test 开头的方法才会执行。

重新修改方法名后 在执行mvn test 即可正常执行。

通常测试我们是通过junit 来编译测试用例,这时就就需添加junit 的依赖。

5、maven 依赖管理

l   在pom 文件中添加junit 依赖

l  修改测试类,加入junit 代码

l  执行测试命令

提问:

在刚才的演示过程当中 ,junit jar包在哪里?是怎么加入到classPath 当中去的?maven 是在执行test 命令的时间 动态从本地仓库中去引入junit jar 包,如果找不到就会去远程仓库下载,然后在引入。

本地仓库位置:

本地仓库位置默认在 ~/.m2/respository 下

要修改 ${M2_HOME}/conf/settings.xml  来指定仓库目录

<!-- 指定本地仓库目录-->

<localRepository>G:\.m2\repository</localRepository>


二、maven核心配置

概要:

  1. 项目依懒(内部、外部)
  2. 项目聚合与继承
  3. 项目构建配置

项目依懒

项目依赖是指maven 通过依赖传播、依赖优先原则、可选依赖、排除依赖、依赖范围等特性来管理项目ClassPath。

1、依赖传播特性:

我们的项目通常需要依赖第三方组件,而第三方组件又会依赖其它组件遇到这种情况Maven会将依赖网络中的所有节点都会加入ClassPath当中,这就是Maven的依赖传播特性。

举例演示Spring MVC的依赖网络

<!-- 添加spring web mvc演示 -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-webmvc</artifactId>

<version>5.0.10.RELEASE</version>

</dependency>

在刚刚的演示当中,项目直接依赖了spring-webmvc 叫直接依赖,而对commons-logging 依赖是通过webmvc传递的所以叫间接依赖。

2、依赖优先原则

基于依赖传播特性,导致整个依赖网络会很复杂,难免会出现相同组件不同版本的情况。Maven此时会基于依赖优先原则选择其中一个版本。

  第一原则:最短路径优先。

  第二原则:相同路径下配置在前的优先。

第一原则演示

<!-- 直接添加commons-logging -->

<dependency>

<groupId>commons-logging</groupId>

<artifactId>commons-logging</artifactId>

<version>1.2</version>

</dependency>

上述例子中commons-logging 通过spring-webmvc 依赖了1.1.3,而项目中直接依赖了1.2,基于最短路径原则项目最终引入的是1.2 版本。

第二原则演示:

步骤:

  1. 添加一个新工程Project B
  2. 配置Project B 依赖 spring-web.3.2.9.RELEASE
  3. 当前工程直接依赖 Project B

配置完之后,当前工程 project A 有两条路径可以依赖 spring-web,选择哪一条 就取决于 对 webmvc 和 Project B的配置先后顺序。

Project A==> spring-webmvc.4.0.0.RELEASE ==> spring-web.4.0.0.RELEASE

Project A==>   Project B 1.0.SNAPSHOT ==>spring-web.3.2.9.RELEASE

注意:在同一pom文件,第二原则不在适应。如下配置,最终引用的是1.2 版本,而不是配置在前面的1.1.1版本。

3、可选依赖

可选依赖表示这个依赖不是必须的。通过在 <dependency>

添加  <optional>true</optional> 表示,默认是不可选的。可选依赖不会被传递。

l  演示可选依赖的效果。

4、排除依赖

即排除指定的间接依赖。通过配置 <exclusions> 配置排除指定组件。

<!-- 排除指定项目 -->

<exclusions>

<exclusion>

<groupId>org.springframework</groupId>

<artifactId>spring-web</artifactId>

</exclusion>

</exclusions>

l  演示排除依赖

5、依赖范围

像junit 这个组件 我们只有在运行测试用例的时候去要用到,这就没有必要在打包的时候把junit.jar 包过构建进去,可以通过Mave 的依赖范围配置<scope>来达到这种目的。maven 总共支持以下四种依赖范围:

compile(默认): 编译范围,编译和打包都会依赖。

provided:提供范围,编译时依赖,但不会打包进去。如:servlet-api.jar

runtime:运行时范围,打包时依赖,编译不会。如:mysql-connector-java.jar

test:测试范围,编译运行测试用例依赖,不会打包进去。如:junit.jar

推荐大家还是通过 将第三方Jar手动install 到仓库。

#手动加入本地仓库
mvn install:install-file -Dfile=abc_client_v1..jar -DgroupId=tuling -DartifactId=tuling-client -Dversion=1.20 -Dpackaging=jar

system 除了可以用于引入系统classpath 中包,也可以用于引入系统非maven  收录的第三方Jar,做法是将第三方Jar放置在 项目的 lib 目录下,然后配置 相对路径,但因system 不会打包进去所以需要配合 maven-dependency-plugin 插件配合使用。

<!-- 通过插件 将system 的第三方jar 打包进去。 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>compile</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
          <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/lib</outputDirectory>
<includeScope>system</includeScope>
<excludeGroupIds>com.sun</excludeGroupIds>
</configuration>
</execution>
</executions>
</plugin>

项目聚合与继承

1、聚合

是指将多个模块整合在一起,统一构建,避免一个一个的构建。聚合需要个父工程,然后使用 <modules> 进行配置其中对应的是子工程的相对路径

<modules>

<module>tuling-client</module>

<module>tuling-server</module>

</modules>

2、继承

继承是指子工程直接继承父工程 当中的属性、依赖、插件等配置,避免重复配置。

  1. 属性继承:
  2. 依赖继承:
  3. 插件继承:

上面的三个配置子工程都可以进行重写,重写之后以子工程的为准。

3、依赖管理

通过继承的特性,子工程是可以间接依赖父工程的依赖,但多个子工程依赖有时并不一至,这时就可以在父工程中加入 <dependencyManagement> 声明该功程需要的JAR包,然后在子工程中引入。

4、项目属性:

通过 <properties> 配置 属性参数,可以简化配置。

<!-- 配置proName属性 -->

<properties>

<proName>ddd</proName>

</properties>

<!-- 引用方式 -->

${proName}

maven 默认的属性

${basedir} 项目根目录

${version}表示项目版本;

${project.basedir}同${basedir};

${project.version}表示项目版本,与${version}相同;

${project.build.directory} 构建目录,缺省为target

${project.build.sourceEncoding}表示主源码的编码格式;

${project.build.sourceDirectory}表示主源码路径;

${project.build.finalName}表示输出文件名称;

${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes


项目构建配置

  1. 构建资源配置
  2. 编译插件
  3. profile 指定编译环境

构建资源配置

基本配置示例:

<defaultGoal>package</defaultGoal>

<directory>${basedir}/target2</directory>

<finalName>${artifactId}-${version}</finalName>

说明:

defaultGoal,执行构建时默认的goal或phase,如jar:jar或者package等

directory,构建的结果所在的路径,默认为${basedir}/target目录

finalName,构建的最终结果的名字,该名字可能在其他plugin中被改变

<resources>  配置示例

<resources>

<resource>

<directory>src/main/java</directory>

<includes>

<include>**/*.MF</include>

<include>**/*.XML</include>

</includes>

<filtering>true</filtering>

</resource>

<resource>

<directory>src/main/resources</directory>

<includes>

<include>**/*</include>

<include>*</include>

</includes>

<filtering>true</filtering>

</resource>

</resources>

说明:

  • resources,build过程中涉及的资源文件
  • targetPath,资源文件的目标路径
  • directory,资源文件的路径,默认位于${basedir}/src/main/resources/目录下
  • includes,一组文件名的匹配模式,被匹配的资源文件将被构建过程处理
  • excludes,一组文件名的匹配模式,被匹配的资源文件将被构建过程忽略。同时被includes和excludes匹配的资源文件,将被忽略。
  • filtering: 默认false ,true 表示 通过参数 对 资源文件中 的${key} 在编译时进行动态变更。替换源可紧跟 -Dkey 和pom 中的<properties> 值 或  <filters> 中指定的properties 文件。

一、VIP课程:互联网工程专题 03-Maven基本概念与核心配置的更多相关文章

  1. 一、VIP课程:互联网工程专题 01-Git基本概念与核心命令掌握

    第一课:Git基本概念与核心命令掌握.docx 课程概要: GIT 体系概述 GIT 核心命令使用 GIT 底层原理 一.GIT体系概述 1.使用方式区别 从本地把文件推送远程服务,SVN只需要com ...

  2. 一、VIP课程:互联网工程专题 05-快速掌握Jenkins原理与核心功能

    第五课:快速掌握jenkins核心功能.docx 2.164 (2019-02) and newer: Java 8 or Java 11 一.jenkins 概述与环境配置 知识点: 关于可持续化集 ...

  3. 一、VIP课程:互联网工程专题 04-Maven私服使用与插件开发

    第四课:Maven私服构建与插件开发.docx 一.maven 生命周期 知识点概要: 生命周期的概念与意义 maven 三大生命周期与其对应的phase(阶段) 生命周期与插件的关系 生命周期与默认 ...

  4. 一、VIP课程:互联网工程专题 02-Git服务搭建与版本分支管理

    第二课:搭建企业私有Git服务.docx 课程概要: GIT远程通信协议详解 基于gogs 搭建WEB管理服务 一.GIT服务器搭建方式 上一节课我们讲过GIT是一个分布式版本管理系统,既然是分布那么 ...

  5. 图灵,咕泡,鲁班学院--Java高级架构师-互联网企业级实战VIP课程(价值6380)

    课程介绍:        讲课内容涉及Java互联网技术工程框架.应用框架.        性能调优 (Tomcat Nginx JVM)         分布式框架(并发编程 Zookeeper N ...

  6. 最新咕咆+鲁班+图灵+享学+蚂蚁+硅谷+源码 Java架构师资料《Java架构师VIP课程》

    最新的Java架构师完整资料,完整视频+源码+文档. 每一套都是一百多个G的资料,无密. JAVA架构师全套课程 咕泡学院互联网架构师第一期 咕泡学院互联网架构师第二期 咕泡学院互联网架构师第三期 博 ...

  7. 图灵学院java架构师vip课程第二期 完整版课程下载 无加密

    部分目录2020年新图灵学院Java二期架构师教程下载[课程目录]├──一.VIP课程:互联网工程专题├──二.VIP课程:源码框架专题├──三.VIP课程:并发编程专题├──四.VIP课程:性能调优 ...

  8. Maven - Maven基础概念和操作总结

    1-下载及安装 1.1 - Maven - 项目管理利器 http://maven.apache.org/ Apache组织的开源项目. Maven是一个基于POM(Project Object Mo ...

  9. eclipse 创建maven 项目 动态web工程完整示例 maven 整合springmvc整合mybatis

    接上一篇: eclipse 创建maven 项目 动态web工程完整示例 eclipse maven工程自动添加依赖设置 maven工程可以在线搜索依赖的jar包,还是非常方便的 但是有的时候可能还需 ...

随机推荐

  1. postgres登录失败Connection refused与SSL off失败

    连接失败问题 使用postgres数据库连接工具测试,遇到两次失败 第一个登录失败问题 Connection to 192.168.XX.XX:5432 refused. Check that the ...

  2. 01背包问题_回溯法&分支限界法

    package 分支限界法; import java.util.LinkedList; import java.util.Scanner; /*01背包问题*/ public class ZOPack ...

  3. PIL pip error

    结果显示: 提示——Could not find a version that satisfies the requirement PIL (from versions: )No matching d ...

  4. Django 3.0 中连接mysql 8.0,可以不使用pymysql ,升级Mysqlclient即可

    python 中,连接mysql一般都推荐用pymysql ,而且在django中,网上的教程都是这么连接mysql的. import pymysql pymysql.install_as_MySQL ...

  5. Slim安装以及使用

    最近在用backbone.js 做东西,因为牵扯到REST services 所以需要后台支持,此处选择了php.Slim 是php的一个框架. 貌似国内文章对此的介绍比较少,在安装Slim的过程中出 ...

  6. leetcode322 Coin Change

    """ You are given coins of different denominations and a total amount of money amount ...

  7. SciPy 优化

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  8. 全面理解Java中的String数据类型

    1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...

  9. (十二)微信小程序实现登陆页面+登陆逻辑

    微信小程序实现登陆页面 实现上面两个页面 第一个页面 <view> <!-- 上侧部分 --> <view class="top-view"> ...

  10. windows制作动态链接库和使用二

    动态库的另一种制作方法: 不使用_declspec(dllexport)关键字,使用.def文件 //exportFun.def 文件名随意 EXPORT add @ //格式 函数名 @编号 < ...