Maven简易笔记
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>
:组IDartifactId
:maven项目唯一定位值<version>
:版本<package>
:打包方式,常用的有pom(父项目)、jar
、war
、era
、maven-plugin
等<properties>
:配置属性值,可供其他标签引用<depandencies>
:依赖项目配置<build>
:构建项目要执行任务的配置<profiles>
:不同的平台对应不同的环境
GAV
GAV即groupId
,artifactId
,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简易笔记的更多相关文章
- Maven学习笔记-03-Eclipse下maven项目在Tomcat7和Jetty6中部署调试
现在最新的Eclipse Luna Release 已经内置了Maven插件,这让我们的工作简洁了不少,只要把项目直接导入就可以,不用考虑插件什么的问题,但是导入之后的项目既可以部署在Tomcat也可 ...
- Gson 简易笔记
#Gson 简易笔记 之前用 fastjson.它连个规矩的文档都没有,而且在github的wiki上写着: gson的g可能是"龟"拼音的缩写,龟速的json库." 各 ...
- Maven学习笔记-04-Eclipse下maven项目在Tomcat7和Jetty6中部署调试
现在最新的Eclipse Luna Release 已经内置了Maven插件,这让我们的工作简洁了不少,只要把项目直接导入就可以,不用考虑插件什么的问题,但是导入之后的项目既可以部署在Tomcat也可 ...
- Maven学习笔记—仓库
Maven仓库 1 什么是Maven仓库 在Maven中,任何一个依赖.插件或者项目构建的输出,都可以成为构件,而Maven通常在某个位置统一的存储所有Maven项目共享的构件,这个统一的位置就是Ma ...
- MAVEN学习笔记之Maven插件的应用(4)
MAVEN学习笔记之Maven插件的应用(4) <build> <pluginManagement> <plugins> <plugin> <gr ...
- MAVEN学习笔记之Maven生命周期和插件简介(3)
MAVEN学习笔记之Maven生命周期和插件简介(3) clean compile site三套生命周期相互独立. clean pre-clean 执行清理前的工作 clean 清理上一次构建生成的所 ...
- MAVEN学习笔记之私服Nexus(2)
MAVEN学习笔记之私服Nexus(2) 私有服务器搭建 Nexus www.snatype.org下载 snatype-work 是默认nexus存储nexus a:将bin添加到环境中 Admin ...
- MAVEN学习笔记之基础(1)
MAVEN学习笔记之基础(1) 0.0 maven文件结构 pom.xml src main java package resource test java package resource targ ...
- Maven 学习笔记(二)
前面一文——Maven 学习笔记(一)中已经提到了 pom 的大部分配置,Maven 本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给创建来完成,每一个任务都会对应一个插件 ...
随机推荐
- ios label根据内容自适应高度
label自适应高度,想必大家也都很熟悉怎么去做,上代码: UILabel *label3 = [[UILabel alloc]initWithFrame:CGRectMake(150, 50, 15 ...
- RedisTemplate通过scan方法进行自定义操作:1、根据hashKey的名称匹配相关hash键值对
需求:有一个hash如下,现在想查询出stream前缀的键值对 操作方法如下: package com.example; import org.junit.Before; import org.jun ...
- [LeetCode] 40. Combination Sum II 组合之和 II
Given a collection of candidate numbers (candidates) and a target number (target), find all unique c ...
- [LeetCode] 274. H-Index H指数
Given an array of citations (each citation is a non-negative integer) of a researcher, write a funct ...
- linux:使用python脚本监控某个进程是否存在(不使用crontab)
背景: 需要每天定时去检测crontab进程是否启动,所以不能用crontab来启动检测脚本了,直接使用while 循环和sleep方式实现定时检测 # coding:utf-8 import os ...
- pycharm django使用技巧
- pandas中的axis参数(看其他人的博客中产生的疑问点,用自己的话解析出来)
axis有两个值:axis=0或者axis=1 看到很多资料都不太理解,把我个人理解说一下: 下面这张图,在很多资料中都看到了,我只能说先死记住 axis=0,代表跨行(注意看这张图的axis=0的箭 ...
- nRF24L01/nRF24L01+应用总结
nRF24L01+是nRF24L01的升级款,比较显眼的区别是nRF24L01+比nRF24L01多了一个250Kbps传输速率.其它的还有接收模式官方给的耗电量是不一样的.个别寄存器名字不一样. 接 ...
- java实现rabbitMQ消息收发方式
定义:消息队列(MQ)是一种应用程序对应用程序的通信方法是AMQP协议. jar包依赖: <!-- 加入mq消息依赖包 --> <dependency> &l ...
- 基础数字电路的Verilog写法
Verilog是硬件描述电路,我对此一直稀里糊涂,于是将锆石科技开发板附带的的一些基础数字电路Verilog程序整理记录下来,并且查看他们的RTL视图,总算有点理解了. 1.基本运算符 module ...