Maven笔记

Maven用来管理Java项目,主要负责构建项目:验证、编译、测试、打包、分发等。

Maven组成

  • 配置依赖关系、约定目录结构以及构建项目的整个流程
  • pom.xml文件专门用于配置项目:依赖及其版本、插件、远程库等
  • 委托外部组件执行生命周期任务的插件架构

安装配置

在Window上,将编译好的二进制文件压缩包解压到磁盘下,之后将bin目录配置到环境变量的Path变量下即可。另外,由于国内连接Maven中心远程库的效率较低,可以在setting.xml文件下的<mirrors>标签下配置阿里云镜像库。

Linux大同小异,解压后,配置path变量即可。

基本概念

Maven目录的典型结构

以上就是一个典型的Maven管理的Java项目结构,如果是web项目,在main目录下还可以有一个webapp目录。resources主要放置配置文件和各种属性文件,webapp主要放置web资源文件。

POM文件格式

一个典型的pom文件一级标签如下:

  • <project>:根元素
  • <groupId>:组ID
  • artifactId:maven项目唯一定位值
  • <version>:版本
  • <package>:打包方式,常用的有pom(父项目)、jarwareramaven-plugin
  • <properties>:配置属性值,可供其他标签引用
  • <depandencies>:依赖项目配置
  • <build>:构建项目要执行任务的配置
  • <profiles>:不同的平台对应不同的环境

GAV

GAV即groupIdartifactId,version三个,这三个值在一个Maven库中唯一确定一个项目

依赖

一个典型的依赖如下所示:

    <dependencies>
<!--think in java安装到本地的net.mindview.util.jar包-->
<dependency>
<groupId>net.mindview</groupId>
<artifactId>util</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
</dependencies>

GAV就不说了,scope表示该依赖作用的范围,比如

  • compile是默认值,作用在编译和执行阶段
  • runtime只在执行阶段需要
  • test只在测试阶段需要
  • 还有其他。。。不一而足

依赖管理与父项目

当一个项目被其他项目设为父项目的时候,该项目的package方式就是pom,同时子项目会继承父项目的依赖以及版本。但是很多时候,除了公共依赖部分会在父项目中显示的depandency,而每个子项目也有自己的依赖。当某两个或者三个子项目依赖相同,但是有没有在父项目中继承的时候,他们的同一版本管理就成了问题。

一种解决方案是,在父目录中只声明依赖,而不实际引用,怎么操作呢,如下:

    <dependencyManagement>
<dependencies>
<!--Junit 单元测试一家子,scope:test-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>

这个dependencyManagement中只负责声明,而子项目如果有需要就只需要在dependency中引用即可,而且不需要配置version,直接继承父项目的声明。如果有特别版本需要,也可覆盖声明。同时,父项目修改声明的版本,所有继承的子项目直接修改,不需要一个个配置。

同时,还有一种方案,就是配置scope=import,他可以将外部非parent的项目的依赖声明导入进来。

关于父项目的一点主意事项

父项目可以作为一个聚合器(当然不是父项目也可以),使用如下方式:

    <modules>
<module>effjava</module>
<module>algorithms</module>
<module>multithread</module>
<module>java8</module>
<module>thinkinjava</module>
<module>jackson</module>
</modules>

其中,每一个module都是他的子项目,parent作为子项目的聚合器,一一声明

另外一点,就是父项目如果没有被deploy到远程或者本地库中,而是作为代码存在,那么子项目在声明parent的时候,需要使用ralativePath声明父项目的pom文件位置,如下:

<parent>
<artifactId>EffectiveJava</artifactId>
<groupId>com.luzj</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

repository

repository分为本地库和远程库,本地库就是在本地.m2目录下的依赖文件管理库,远程库一种分为Maven官方中心库,一种是个人搭建的私库。如果需要使用私库或者第三方库,则需要在repository标签下声明库地址。

当maven开始构建并且检查依赖的时候,一般会检查本地库有没有,没有就会向远程库下载。

具体如果配置远程库等,可以参考Maven官方文档

Maven构建生命周期与插件

生命周期

  • validate:验证项目是否正确,信息是否就绪
  • compile:编译源码
  • test:运行测试用例
  • package:打包
  • install:将项目安装到本地库
  • deploy:分发到远程库

插件

以上这些周期任务的执行,maven本身不负责,而是委托给插件负责。一般如果没有在项目特别声明插件,Maven就会使用默认的插件。比如编译插件为maven-compile-plugin。他们都配置在build->plugins->plugin标签下。build是配置Maven构建流程的主要根标签,其下面可以有很多选项配置构建任务以及插件选择等。具体可参考Maven文档

插件管理,也如同依赖管理一样,主要使用pluginManagement配置。

maven命令

结构如下:

mvn [options] [<goals>] [<phases>]

典型的如下:

mvn archetype:create
-DgroupId=packageName
-DartifactId=projectName

参考

Maven简易笔记的更多相关文章

  1. Maven学习笔记-03-Eclipse下maven项目在Tomcat7和Jetty6中部署调试

    现在最新的Eclipse Luna Release 已经内置了Maven插件,这让我们的工作简洁了不少,只要把项目直接导入就可以,不用考虑插件什么的问题,但是导入之后的项目既可以部署在Tomcat也可 ...

  2. Gson 简易笔记

    #Gson 简易笔记 之前用 fastjson.它连个规矩的文档都没有,而且在github的wiki上写着: gson的g可能是"龟"拼音的缩写,龟速的json库." 各 ...

  3. Maven学习笔记-04-Eclipse下maven项目在Tomcat7和Jetty6中部署调试

    现在最新的Eclipse Luna Release 已经内置了Maven插件,这让我们的工作简洁了不少,只要把项目直接导入就可以,不用考虑插件什么的问题,但是导入之后的项目既可以部署在Tomcat也可 ...

  4. Maven学习笔记—仓库

    Maven仓库 1 什么是Maven仓库 在Maven中,任何一个依赖.插件或者项目构建的输出,都可以成为构件,而Maven通常在某个位置统一的存储所有Maven项目共享的构件,这个统一的位置就是Ma ...

  5. MAVEN学习笔记之Maven插件的应用(4)

    MAVEN学习笔记之Maven插件的应用(4) <build> <pluginManagement> <plugins> <plugin> <gr ...

  6. MAVEN学习笔记之Maven生命周期和插件简介(3)

    MAVEN学习笔记之Maven生命周期和插件简介(3) clean compile site三套生命周期相互独立. clean pre-clean 执行清理前的工作 clean 清理上一次构建生成的所 ...

  7. MAVEN学习笔记之私服Nexus(2)

    MAVEN学习笔记之私服Nexus(2) 私有服务器搭建 Nexus www.snatype.org下载 snatype-work 是默认nexus存储nexus a:将bin添加到环境中 Admin ...

  8. MAVEN学习笔记之基础(1)

    MAVEN学习笔记之基础(1) 0.0 maven文件结构 pom.xml src main java package resource test java package resource targ ...

  9. Maven 学习笔记(二)

    前面一文——Maven 学习笔记(一)中已经提到了 pom 的大部分配置,Maven 本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给创建来完成,每一个任务都会对应一个插件 ...

随机推荐

  1. 【VS开发】【C/C++开发】memcpy和memmove的区别

    memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下: void *memcpy(void *dst, const void ...

  2. flask框架(三)——路由系统route转换成add_url_rule及源码分析

    这节我们不用@app.route来写路由,而是通过add_url_rule 传统写法  (<int:nid>传递int类型参数,endpoint是取别名) @app.route('/det ...

  3. (二)pdf的构成综述

    引自:https://blog.csdn.net/steve_cui/article/details/81948486 一个pdf文件主要是由4部分构成:文件头.文件体.交叉引用表.文件尾 文件头:用 ...

  4. ffmpeg 速查手册

    ref : http://linux.51yip.com/search/ffmpeg ffmpeg是一个源于Linux的工具软件,是FLV视频转换器,可以轻易地实现FLV向其它格式avi.asf. m ...

  5. yum安装k8s集群

    k8s的安装有多种方式,如yum安装,kubeadm安装,二进制安装等.本文是入门系列,只是为了快速了解k8s的原理和工作过程,对k8s有一个快速的了解,这里直接采用yum安装 的1.5.2为案例进行 ...

  6. windows10 iis浏览wcf报404.3错误

    报错:HTTP错误404.3-Not Found 由于扩展配置问题而无法提供您请求的页面.如果该页面是脚本,请添加处理程序.如果应下载文件,请添加MIME映射. 解决步骤如下: 控制面板->打开 ...

  7. ES6之reduce和reduceRight方法应用实例

    for循环是最基本的遍历循环,但是有些时候并不是很实用,且效率和性能较低,故本文列举出工作学习中碰到的reduce方法应用实例,供自己揣摩熟练应用,以提高自己的研发水平和研发效率. reduce方法( ...

  8. WebClient 请求 https 页面出错:未能创建 SSL/TLS 安全通道

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | Securi ...

  9. 6:Partial Update 内部原理 和 乐观锁并发控制

    Partial Update 内部执行过程: 首先,ES文档是不可变的,它们只能被修改,不能被替换.Update Api 也不例外. Update API 简单使用与之前描述相同的 检索-修改-重建索 ...

  10. php-sql-server-2017

    Download the Microsoft Drivers for PHP for SQL Server https://docs.microsoft.com/en-us/sql/connect/p ...