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. 【题解】#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT)

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

  2. echarts在一个折线/柱状图浮窗显示多条数据

    解决问题就在data里面,首先 data里面是可以json数组形式,如官方API上的 name:”“, value:”“,等 value是echart识别折线图的key值.1.来看数据格式 data: ...

  3. 洛谷P1427 小鱼的数字游戏 题解 递归入门题

    题目链接:https://www.luogu.com.cn/problem/P1427 题目大意: 给你一串数(输入到0为止),倒序输出这些数. 解题思路: 首先这道题目可以用数组存数据,然后输出. ...

  4. 「Luogu P2015」二叉苹果树 解题报告

    题面 一个二叉树,边数为n\((2<n\le 100)\),每条边有一个权值,求剪枝后剩下p\((1<p<n)\)条边,使p条边的权值和最大 还看不懂?-- 2 5 input:5 ...

  5. 「Luogu P2278」[HNOI2003]操作系统 解题报告

    题面 一道模拟题,模拟CPU的处理过程?!省选模拟题 思路: 模拟退火大法+优先队列乱搞 要注意的点 1.空闲时,CPU要处理进程 2.当队列中没有进程时,要先进行判断,然后访问 3.当优先级高的进程 ...

  6. 曹工说Spring Boot源码(8)-- Spring解析xml文件,到底从中得到了什么(util命名空间)

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  7. 大数据框架开发基础之Sqoop(1) 入门

    Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle , ...

  8. 【转】常见Java面试题 – 第四部分:迭代(iteration)和递归(recursion)

    ImportNew注: 本文是ImportNew编译整理的Java面试题系列文章之一.你可以从这里查看全部的Java面试系列. Q.请写一段代码来计算给定文本内字符“A”的个数.分别用迭代和递归两种方 ...

  9. Spring Cloud(一):服务注册中心Eureka

    Spring Cloud 基于 Netflix 的几个开源项目进行了封装,提供包括服务注册与发现(Eureka),智能路由(Zuul),熔断器(Hystrix),客户端负载均衡(Ribbon)等在内的 ...

  10. 使用内存映射文件MMF实现大数据量导出时的内存优化

    前言 导出功能几乎是所有应用系统必不可少功能,今天我们来谈一谈,如何使用内存映射文件MMF进行内存优化,本文重点介绍使用方法,相关原理可以参考文末的连接 实现 我们以单次导出一个excel举例(csv ...