Maven

  Maven是一款自动化构建工具,专注服务于Java平台的项目构建和依赖管理。Project Object Model:项目对象模型。将Java工程的相关信息封装为对象形式作为便于操作和管理的模型。

Maven作用

   1 添加第三方jar包:使用 Maven 后每个 jar 包只需在本地仓库中保存一份

  2 jar包之间的依赖关系:Maven 可自动的将当前 jar 包所依赖的其他所有jar包全部导入

  3 处理jar包之间的冲突:Maven中内置了两条依赖原则:最短路径者优先和先声明者优先。可以自动的处理jar包之间的冲突问题

  4 获取第三方jar包:Maven 会自动从中央仓库下载,并同时下载这个 jar 包所依赖的其他 jar 包——规范、完整、准确!一次性解决所有问题

  5 将项目拆分成多个工程模块:Maven 的依赖管理机制,可将项目拆分成多个工程协同开发

  6 实现项目的分布式部署:将项目拆分成多个模块后,每个模块可运行在独立的服务器。我们称之为分布式部署

  核心概念

    ①POM  ②约定的目录结构  ③坐标  ④依赖管理  ⑤仓库管理  ⑥生命周期  ⑦插件和目标  ⑧继承  ⑨聚合

  配置本地仓库

    在 Maven 的核心配置文件:D:\apache-maven-3.5.0\conf\settings.xml 中的标签

<localRepository>D:/RepMaven</localRepository>(指定本地仓库文件路径)

     在settings.xml文件 mirrors 标签中配置阿里镜像服务器

    <mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

自动化构建

  JavaEE 开发普遍认同的观点:约定>配置>编码。意思就是能用配置解决的问题就不编码,能基于约定的就不进行配置。maven默认从<项目根目录>/src/main/java这个目录去查找Java源文件,编译后的class文件会保存在<项目根目录>/target/classes目录。在maven中,所有的PO都有一个根对象,就是Super POM。Super POM中定义了所有的默认的配置项

  构建:编写的 Java 代码经过编译得到对应的 .class 文件,将 Web 工程编译的结果“拿”到服务器上的指定目录结构,我们叫部署,在实际项目中除此之外,还包括第三方框架的 jar 包以及各种配置文件。都必须按照正确的目录结构部署到服务器上才可以运行。而这些 Maven 通过一些命令都可以帮我自动构建完成。对应 pom.xml 中也就是<build>元素中的内容。也就是 Lifecycle 生命周期

  构建环节

    ①清理:删除以前的编译结果,为重新编译做好准备

    ②编译:将Java源程序编译为字节码文件

    ③测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性

    ④报告:在每一次测试后以标准的格式记录和展示测试结果

    ⑤打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应jar包,Web工程对应war包

    ⑥安装:在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中

    ⑦部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行

生命周期

  ●Maven生命周期定义了各个构建环节的执行顺序,有了这个清单,Maven就可以自动化的执行构建命令了。

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

    ①Clean Lifecycle在进行真正的构建之前进行一些清理工作。

    ②Default Lifecycle构建的核心部分,编译,测试,打包,安装,部署等等。

    ③Site Lifecycle生成项目报告,站点,发布站点。

  它们是相互独立的,你可以仅仅调用 clean 来清理工作目录,仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。

  运行任何一个阶段的时候,它前面的所有阶段都会被运行。 但生命周期是抽象的(Maven的生命周期本身是不做任何实际工作), 任务执行(如编译源代码)均交由插件完成。Maven 的插件机制是完全依赖Maven的生命周期的,所谓的插件 plugin 其实也就是一个maven项目,只不过这个项目会引用maven的一些API,plugin项目也具备maven坐标。

 插件和目标

  ●生命周期的阶段 phase 与插件的目标 goal 相互绑定, 用以完成实际的构建任务.

  ●每个插件都能实现多个功能,每个功能就是一个插件目标。

  ●Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务。

  maven命令的语法为  mvn [options] [goal(s)] [phase(s)]

    如: mvn compiler:compile 冒号前是插件前缀, 后面是该插件目标或功能

  clean 移除所有上一次构建生成的文件

site 生成项目的站点文档

deploy 将生成的站点文档部署到特定的服务器上

继承、依赖、聚合

  Maven的聚合特性(aggregation)能够使项目的多个模块聚合在一起构建, 而继承特性(inheritance)能够帮助抽取各模块相同的依赖、插件等配置,在简化模块配置的同时, 保持各模块一致.

  任何一个Maven项目都隐式地继承自超级POM, 因此超级POM的大量配置都会被所有的Maven项目继承, 这些配置也成为了Maven所提倡的约定.

 
  当一个模块项目引入另一个模块或第三方 jar 包时,我们就称他们之间有依赖关系。依赖有直接依赖和间接依赖,并且规定了之间依赖范围和原则等

父POM

  注意:打包方式要设置为 pom

<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>cn.gc.atcrowdfunding</groupId>
<artifactId>atcrowdfunding-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<description>父工程,聚合其他工程</description>
<!-- 版本管理-->
<properties>
<junit.version>4.12</junit.version>
</properties>
<>
<dependencies>
<!-- 公共依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 聚合管理 -->
<modules>
<module>../atcrowdfunding-common</module>
<module>../atcrowdfunding-manager</module>
</modules>
</project>

   坐标:使用三个向量在 Maven 的仓库中确定一个Maven工程,由此可用于其他项目模块的依赖或继承

    [1] groupId:公司或组织的域名倒序+当前项目名称

    [2] artifactId:当前项目的模块名称

    [3] version:当前模块的版本

  我们自己的 Maven 工程必须执行安装(install)操作才会进入仓库,我们通过坐标可以到仓库中找到对应 jar 包。将gav三个向量连起来再加上 a-v

\cn\gc\maven\maven1\0.0.1-SNAPSHOT\maven1-0.0.1-SNAPSHOT.jar

  [4] packaging : 打包的机制,如pom,jar, maven-plugin, ejb, war, ear, rar, par,默认为jar -->

    pom 打包父工程,war 打包 Web 工程,jar 打包普通工程

  [5] properties : 为pom定义一些常量,在pom中的其它地方可以直接引用,用来控制版本号

    使用方式 如 ${junit.version}

  [6] dependencyManagement :在父工程中管理依赖

    在父工程中引入的 jar 包全部都会被子工程继承,但有时某些子工程我们不需要父工程中的 jar 包。我们可将父工程中的 dependencies 标签,用 dependencyManagement 标签括起来,这样子工程需要什么 jar 包只需引入对应 groupId 和 artifactId 即可版本直接由父工程管理

  [7] dependencies 定义本项目的依赖关系

    在此标签内如此模块需要引入那个 jar 包只需在此子标签 dependency 中定义即可。依赖管理规定了几个原则

    依赖的范围 scope 包含如下的取值:compile(编译范围)、provided(已提供范围)、runtime(运行时范围)、test(测试范围)、system(系统范围)

    默认为 compile 如果A依赖B,B依赖C,那么A→B和B→C都是直接依赖,而A→C是间接依赖,通过依赖范围就可控制其直接是否有依赖关系

    ① compile (默认)

      [1]main目录下的Java代码可以访问这个范围的依赖

      [2]test目录下的Java代码可以访问这个范围的依赖

      [3]部署到Tomcat服务器上运行时放在WEB-INF的lib目录下

    ② test

      [1]main目录下的Java代码不能访问这个范围的依赖

      [2]test目录下的Java代码可以访问这个范围的依赖

      [3]部署到Tomcat服务器上运行时不会放在WEB-INF的lib目录下

    ③ provided

      [1]main目录下的Java代码可以访问这个范围的依赖

      [2]test目录下的Java代码可以访问这个范围的依赖

      [3]部署到Tomcat服务器上运行时不会放在WEB-INF的lib目录下

    ④ runtime[了解]

      [1]main目录下的Java代码不能访问这个范围的依赖

      [2]test目录下的Java代码可以访问这个范围的依赖

      [3]部署到Tomcat服务器上运行时放在WEB-INF的lib目录下

    依赖的原则:解决jar包冲突

      ①路径最短者优先

      ②路径相同时先声明者优先。先后顺序指的是 dependency 标签配置的先后顺序

    依赖的排除:为了确保程序正确可以将有可能重复的间接依赖排除。排除掉后也可以自行依赖其他版本

    <!-- 依赖排除 -->
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
 
  当依赖、插件的版本、配置等信息在父POM中声明之后, 子模块在使用时就无须声明这些信息, 也就不会出现多个子模块使用的依赖版本不一致的情况, 也就降低了依赖冲突的几率. 另外如果子模块不显式声明依赖与插件的使用, 即使已经在父POM的dependencyManagement、pluginManagement中配置了, 也不会产生实际的效果.
  [8] modules : 实现聚合的核心,module 值为被聚合模块相对于聚合POM的相对路径, 每个被聚合模块下还各自包含有pom.xml、src/main/java、src/test/java等内容

子工程POM

<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>
<artifactId>atcrowdfunding-manager</artifactId>
<description>控制器类,业务层接口及实现类,Dao接口及映射文件</description>
<!--在子工程中引用父工程-->
<parent>
<groupId>cn.gc.atcrowdfunding</groupId>
<artifactId>atcrowdfunding-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../atcrowdfunding-parent/pom.xml</relativePath>
</parent>
<dependencies>
   <!--引入父工程模块-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
   <!--构建管理-->
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.42</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>

  

  [9] parent:用于确定父项目的坐标位置

    relativePath:指定从当前子工程的pom.xml文件出发,查找父工程的pom.xml的路径

  如果子工程的 groupId 和 version 如果和父工程重复则可以删除

  在子项目中重新指定需要的依赖,可以不需要改模块的范围和版本号,因为父工程已经帮助管理了

Maven配置详解转载

SuperPom
<!-- START SNIPPET: superpom -->
<project>
<modelVersion>4.0.0</modelVersion> <!-- 定义了中央仓库以及插件仓库, 均为:https://repo.maven.apache.org/maven2 -->
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories> <pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories> <!-- 依次定义了各类代码、资源、输出目录及最终构件名称格式, 这就是Maven项目结构的约定 -->
<build>
<directory>${project.basedir}/target</directory>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<finalName>${project.artifactId}-${project.version}</finalName>
<testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
<sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
<scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
</testResource>
</testResources> <!-- 为核心插件设定版本 -->
<pluginManagement>
<!-- NOTE: These plugins will be removed from future versions of the super POM -->
<!-- They are kept for the moment as they are very unlikely to conflict with lifecycle mappings (MNG-4453) -->
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
</plugin>
<plugin>
<artifactId>maven-release-plugin</artifactId>
<version>2.3.2</version>
</plugin>
</plugins>
</pluginManagement>
</build> <!-- 定义项目报告输出路径 -->
<reporting>
<outputDirectory>${project.build.directory}/site</outputDirectory>
</reporting> <!-- 定义release-profile, 为构件附上源码与文档 -->
<profiles>
<!-- NOTE: The release profile will be removed from future versions of the super POM -->
<profile>
<id>release-profile</id> <activation>
<property>
<name>performRelease</name>
<value>true</value>
</property>
</activation> <build>
<plugins>
<plugin>
<inherited>true</inherited>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<inherited>true</inherited>
<artifactId>maven-javadoc-plugin</artifactId>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<inherited>true</inherited>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<updateReleaseInfo>true</updateReleaseInfo>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles> </project>
<!-- END SNIPPET: superpom -->

Maven - 配置管理的更多相关文章

  1. SpringBoot系列(二)入门知识

    SpringBoot系列(二)入门知识 往期推荐 SpringBoot系列(一)idea新建springboot项目 引言 本来新建springboot项目应该放在入门知识这一章的,但是由于新建spr ...

  2. 统一配置管理 windows linux ide maven gradle docker 【渐进式备份更新~~】

    Tips 系统盘放轻量配置(%HOMEPATH%),仓库盘放大容量文件(自己维护一份 语义化目录结构.txt). Tips               系统盘放 不经常写操作的文件(除轻量配置)    ...

  3. Maven配置详见

    CSDN 2016博客之星评选结果公布    [系列直播]零基础学习微信小程序!      "我的2016"主题征文活动   博客的神秘功能 maven 配置详解 标签: mave ...

  4. Centos 基础开发环境搭建之Maven私服nexus

    hmaster 安装nexus及启动方式 /usr/local/nexus-2.6.3-01/bin ./nexus status Centos 基础开发环境搭建之Maven私服nexus . 软件  ...

  5. 项目开发之使用 maven

    本文将详述 maven 在软件项目中的使用.首先讲述 maven 的基本工作原理及环境的搭建.然后讲述开发及配置管理人员如何使用 maven,最后将介绍 maven 与 eclipse 集成使用. m ...

  6. maven 配置篇 之pom

    maven 配置篇 之pom.xml(一) 博客分类:  pm mavenXML配置管理项目管理junit      说完了settings.xml配置,下来说一下maven2的主要配置pom.xml ...

  7. 使用spring cloud实现分布式配置管理

    <7天学会spring cloud系列>之创建配置管理服务器及实现分布式配置管理应用. 本文涉及到的项目: 开源项目:http://git.oschina.net/zhou666/spri ...

  8. Maven 教程

    Maven 教程 序:几次对Maven 的学习,都因为各种原因 而中途切断了,再一次学习的时候,又不得不重新开始,结果发现 又不记得步骤 又找不到对应的文档.别人写的再好,终究比不过自己亲手实践的得出 ...

  9. maven配置开发

    1.项目中使用Log4j对其日志进行配置管理,采取的方式一种是通过properties文件设置,另一种方式就是通过设置xml文件的配置. 使用场景: 编程模型:log.err();log.debug( ...

随机推荐

  1. 为什么使用kotlin可以节省开发时间

    前言:.kotlin是一门语言,光靠一篇文章要入门不太现实,所以这篇文章重点讲的是kotlin相对于java的一些特性和这些特性带来的好处. 一.简单介绍 Kotlin 是一种在 Java 虚拟机上运 ...

  2. 【题解】#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT)

    [题解]#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT) 之前做这道题不理解,有一点走火入魔了,甚至想要一本近世代数来看,然后通过人类智慧思考后发现, ...

  3. $bzoj2560$ 串珠子 容斥+$dp$

    正解:容斥+$dp$ 解题报告: 传送门$QwQ$ $umm$虽然题目蛮简练的了但还是有点难理解,,,我再抽象一点儿,就说有$n$个点,点$i$和点$j$之间有$a_{i,j}$条无向边可以连,问有多 ...

  4. 无聊读论文:视觉注意力模型RARE2012

    Riche, N., Mancas, M., Duvinage, M., Mibulumukini, M., Gosselin, B., & Dutoit, T. (2013). RARE20 ...

  5. 小小知识点(三十八)MPSK和MQAM调制的实现——利用IQ调制

    IQ调制的原理 (一)调制基本原理 (二)调制基本原理 利用IQ调制实现MPSK(QPSK 8PSK BPSK)和MQAM(16QAM 64QAM)调制     (一)利用IQ调制实现QPSK调制   ...

  6. CF1200E Compress Words | 字符串hash

    传送门 Examples input 1 5 I want to order pizza output 1 Iwantorderpizza input 2 5 sample please ease i ...

  7. 学习集合Collection_通用方法

    Collection 常用接口 集合List和Set通用的方法 public boolean add(E e) 添加对象到集合 public boolean remove(E e) 删除指定元素 pu ...

  8. curl使用post方式访问Spring Cloud gateway报time out错误

    公司老的项目使用是php,要进行重构.其他团队使用php curl函数使用post方式调用Spring Cloud gateway 报time out错误. 但是使用postman测试是没有任何问题, ...

  9. echarts更改轴线颜色

    xAxis : [ { type : 'category', data : ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月 ...

  10. Scala实践9

    1.特征 Traits用于在类之间共享接口和字段.它们类似于Java 8的接口.类和对象可以扩展特征,但是特征不能被实例化,因此没有参数. 定义一个特征 最小特征只是关键字trait和标识符: tra ...