Maven从入门到放弃
1.maven是什么?
maven是Apache下的一个纯java开发的一个开源项目,它是一款能够抽象构建过程,并且提供依赖管理,中央仓库,自动下载构建等功能的项目构建工具。
2.为什么要使用maven工具构建项目?
假如我们在开发两个Java项目,暂时称之为A,B,这两个项目中对于一些特殊功能会有互相依赖的情况下,该如何做两者之间较好的关联呢?是打算在A,B两边共用一套代码进行关联吗?( 这样的做法会非常难以进行后期的维护 )
如果我们将共用的代码打包成jar引入项目中使用的话,那么后期进行代码更新的话是否又要对所有引入的jar进行更新呢?这样的做法似乎非常繁琐。
回想起以前做开发的时候,由于maven技术还没有出现,使用ssh框架进行开发的时候,所有的jar都需要人为的进行统一导入和维护,导致后期的维护难度极高。
而maven正是可以解决以上所说的这些问题。
3.maven会如何进行jar的管理呢?
在maven这款工具里面,有一个特别的概念叫做坐标。这个坐标可不是我们数学里面说的那个坐标,但是在设定上确实和数学的坐标有一点类似,就是每个坐标都会拥有属于它自己的唯一标识。在maven里面也不例外:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
例如上边的这段坐标信息,groupId 通常会用于标识该jar所属的实际项目,由于通常一个项目可能会划分为了多个模块,因此artifactId 则是对于该项目的某个模块进行了一个明确的标识。version元素更多的是定义了该构件的真实版本。通常我们会称呼这一段 dependency 为依赖。
对于依赖的读取还有一个叫做scope的配置
scope的分类 | 讲解 |
---|---|
compile |
默认情况下就是compile类型, 意味着该依赖既要参与编译又要参与后期的测试等环节 |
test | 表示该依赖仅仅参加和测试有关的工作 |
provided |
可以参与编译,测试,运行等周期, 但是在打包的时候会进行exclude的相应操作, 其他方面和compile差异不大 |
runntime | 在编译环节不会参与进来,个人感觉和compile差异不大 |
system |
通常是指不从仓库读取依赖,而是通过本地路径来读取依赖, 因此常与systemPath标签结合使用 |
当然如果对于每个依赖我们都进行相应单独的version设置,那么管理起来会有些繁琐,因此可以使用或者标签进行统一的管理,例如下方的这两组案例:
基于parent的依赖管理:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
基于properties的依赖管理,在properties里面我们可以进行整个项目的统一字符集编码管理或者对于一些依赖jar包统一版本号的管理:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<lombok.version>1.16.6</lombok.version>
<aspectj.version>1.8.11</aspectj.version>
<common.version>3.4</common.version>
<codec.version>1.10</codec.version>
<swagger2.version>2.7.0</swagger2.version>
<mybatis.version>3.3.0</mybatis.version>
<mybatis-spring-boot.version>1.3.1</mybatis-spring-boot.version>
<pagehelper.version>1.2.3</pagehelper.version>
<springfox-swagger-ui.version>2.7.0</springfox-swagger-ui.version>
<mysql.version>5.1.6</mysql.version>
<mongodb.version>3.2.2</mongodb.version>
</properties>
4.maven的仓库
那么当我们将相应的依赖导入到了工程里面之后,又会发生什么事情了呢?
maven的内部会有一个从网上边下载依赖的功能,我们通常称这个拥有依赖jar的平台为仓库。
在maven里面仓库有分为多种:本地仓库,第三方仓库,中央仓库
通常被下载下来的jar会存在开发者电脑上的本地仓库,这个默认的地址是在 $user.home/.m2/repository目录底下:
这里面存储了许多自己曾经下载过的jar,这样就可以避免日后再次使用到相同jar时二次请求中央仓库了。
中央仓库是指maven官方自己维护的一个远程公用仓库:
http://repo1.maven.org/maven2 在这里面提供了丰富的jar包供开发人员进行下载使用。有时候我们在开发中会遇见下载jar包网速过慢的情况,这个时候可以尝试将mirrors配置修改为访问阿里云镜像的配置:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
第三方仓库通常是指公司自己内部搭建的公共类库站点,只提供给公司内部共享服务所使用,通常都是搭建在局域网内部使用,而且对于内部私服的连接,通常公司都会有相关的账号密码进行控制。
Nexus就是一款较为强大的Maven仓库管理工具,它极大地简化了自己内部仓库的维护和外部仓库的访问。利用Nexus你可以只在一个地方就能够完全控制访问 和部署在你所维护仓库中的每个Artifact。
Nexus是一套“开箱即用”的系统不需要数据库,它使用文件系统加Lucene来组织数据。Nexus 使用ExtJS来开发界面,利用Restlet来提供完整的REST APIs,通过m2eclipse与Eclipse集成使用。Nexus支持WebDAV与LDAP安全身份认证。
除了Nexus以外,还有挺多知名的仓库管理工具,例如说JFrog Artifactory
5.maven工程的项目结构是如何的呢?
在idea编译器里面,对于maven工程的创建时候,默认的结构通常都是如下所示:
在开发的时候,通常代码编写都是在main文件夹底下进行,而如果需要编写相应的测试代码则在test目录底下进行,java目录下一般是放置我们的代码内容,resources目录底下更多的是存放一些我们的配置文件,例如说xml,yml,properties这类型的文件内容。
当然如果是创建maven-web结构的工程的话,可以在建立maven工程的时候选择相应的构建模板:
项目结构如下所示:(可能idea版本不同,最终的成效截图会有所出入)
当然,现在的项目大多都是基于父子工程的偏多,maven里面也支持这种工程的搭建,通常我们可以事先构建好一个父工程结构,然后再在父工程的基础上边构建相应的module工程。例如下边的工程截图:
6.maven的常用命令和生命周期
其实maven它本身是具有三套独立的生命周期的,这三套的生命周期分别是clean,default,site,分别有着不同的职责:清理,构建,建立站点
maven的三套生命周期之间实质上是需要互相依赖的,通常都是后者依赖于前者的关系,以clean生命周期为例,它包含的阶段有pre-clean、clean和post-clean。
当用户调用pre-clean的时候,只有pre-clean阶段得以执行;当用户调用clean的时候,pre-clean和clean阶段会得以顺序执行;当用户调用post-clean的时候,pre-clean、clean和post-clean会得以顺序执行。
maven之所以将整个项目的阶段划分得如此细致,我个人的观点是这种细粒度的划分更加地利于工程构建过程中的排查错误,不同的环节由不同的插件来负责这一模块,当抛出了异常报错,我们就只需要对该环节进行分析,例如编译出错,打包出错等。
maven自身提供了非常多的命令供我们使用,下边列举了我们常用的命令基本如下:
mvn archetype:create :创建 Maven 项目
mvn compile :编译源代码
mvn test-compile :编译测试代码
mvn test : 运行应用程序中的单元测试
mvn site : 生成项目相关信息的网站
mvn clean :清除目标目录中的生成结果
mvn package : 依据项目生成 jar 文件
mvn install :在本地 Repository 中安装 jar
7.通过profile文件来指定特定的编译环境
在实际的项目开发过程中,我们通常会需要结合实际的应用场合切换不同的运行环境(dev,test,pre,pro),在不同的环境中我们通常需要读取不同的配置文件,例如不同的数据源配置,端口号配置等。
如果每次切换环境的时候都要开发人员进行相关的手动修改配置的方式来进行的话,那么实际的工作效率会显得较低,不妨可以试试使用pom里面提供的profile配置:
<profiles>
<profile>
<!-- 本地开发环境 -->
<id>dev</id>
<properties>
<profiles.active>dev</profiles.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<!-- 测试环境 -->
<id>test</id>
<properties>
<profiles.active>test</profiles.active>
</properties>
</profile>
<profile>
<!-- 生产环境 -->
<id>pro</id>
<properties>
<profiles.active>pro</profiles.active>
</properties>
</profile>
</profiles>
在pom文件里面配置以上相应的profile内容之后,在进行工程打包的时候默认通过mvn clean package -Pdev(对应profile文件的id)的方式来判断不同环境下的读取方式。
这样我们就可以更加专心的进行代码开发工作,基于这种思路,我们可以通过编写相应的脚本来实现不同环境下自动化打包的功能。
Maven从入门到放弃的更多相关文章
- [大数据从入门到放弃系列教程]在IDEA的Java项目里,配置并加入Scala,写出并运行scala的hello world
[大数据从入门到放弃系列教程]在IDEA的Java项目里,配置并加入Scala,写出并运行scala的hello world 原文链接:http://www.cnblogs.com/blog5277/ ...
- [大数据从入门到放弃系列教程]第一个spark分析程序
[大数据从入门到放弃系列教程]第一个spark分析程序 原文链接:http://www.cnblogs.com/blog5277/p/8580007.html 原文作者:博客园--曲高终和寡 **** ...
- 后端API入门到放弃指北
后端API入门学习指北 了解一下一下概念. RESTful API标准] 所有的API都遵循[RESTful API标准]. 建议大家都简单了解一下HTTP协议和RESTful API相关资料. 阮一 ...
- 发布 Android Library 到 JCenter 从入门到放弃
最近想倒腾一个小小的 UIKit 到 JCenter,为开源社区贡献一点绵薄之力,于是就有了一系列惨无人道的踩坑史.好,接下来,直奔主题,以下是发布流程. 发布到 JCenter 发布到 JCente ...
- CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维
前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...
- [精品书单] C#/.NET 学习之路——从入门到放弃
C#/.NET 学习之路--从入门到放弃 此系列只包含 C#/CLR 学习,不包含应用框架(ASP.NET , WPF , WCF 等)及架构设计学习书籍和资料. C# 入门 <C# 本质论&g ...
- OpenStack从入门到放弃
OpenStack从入门到放弃 目录: 为何选择云计算/云计算之前遇到的问题 什么是云计算 云服务模式 云应用形式 传统应用与云感知应用 openstack及其相关组件介绍 flat/vlan/gre ...
- 绕过校园网的共享限制 win10搭建VPN服务器实现--从入门到放弃
一.开篇立论= =.. 上次说到博主在电脑上搭建了代理服务器来绕过天翼客户端的共享限制,然而经过实际测试还不够完美,所以本着生命不息,折腾不止的精神,我又开始研究搭建vpn服务器= =... (上次的 ...
- 《区块链:从入门到放弃》之obc安装步骤
obc安装步骤 朋友们可能会好奇,厨师不研究菜谱怎么改研究兵法了,哈哈,我原本是app出身,最近被安排去预研区块链和比特币技术,2个月下来,颇有斩获.期间得到IBM的CC同学指导我一步一步安装obc的 ...
随机推荐
- java springboot调用第三方接口 借助hutoool工具类 爬坑
楼主是个后端小白一枚,之前没接触过后端,只学了java基本语法,还是在学校老师教的,学的很浅,什么ssh.ssm框架都没有学,最近在自学spring boot,看书学也看不是很懂,就在b站上看教学视频 ...
- Python连载20-偏函数&zip函数&enumerate函数
一. 偏函数 二. #先举个例子 #把字符串转换为十进制数字 int(') #help(int),int函数中有一个参数base代表把它转换某个进制的数字 #把八进制的字符串转换为十进制 eight ...
- LinkedList源码分析:JDK源码分析系列
如果本文中有不正确的地方请指出由于没有留言可以在公众号添加我的好友共同讨论. 1.介绍 LinkedList 是线程不安全的,允许元素为null的双向链表. 2.继承结构 我们来看一下LinkedLi ...
- C++20 的 Modules
最近看了两篇关于 C++ 20 Modules 很有意思的文章,戳: <Understanding C++ Modules: Part 1: Hello Modules, and Module ...
- http文件传输
上传端: File uploadFile =new File(); PostMethod mPost = null; try{ String targetURL ="; HttpClient ...
- 数字IC前后端设计中的时序收敛(一)前言
本文转自:自己的微信公众号<数字集成电路设计及EDA教程> 里面主要讲解数字IC前端.后端.DFT.低功耗设计以及验证等相关知识,并且讲解了其中用到的各种EDA工具的教程. 为了纪念,同时 ...
- stixel_world+Multi_stioxel_world+semantic_stixel_world知识拓展
Semantic_Stixel_World 学习笔记 因项目方向更改,该研究暂停, 转为opengl等3D渲染. Author: Ian 星期四, 20. 六月 2019 06:11下午 最近看网络上 ...
- WinForm控件之【Button】
基本介绍 普通按钮大部分情况下用作页面对某系列操作后的提交确认,应用较为广泛,在winfrom控件当中使用设置都相对的简单. 常设置属性.事件 Image:控件上显示的图片: Enabled :指示 ...
- Windows Presentation Foundation (WPF) 项目中不支持xxx的解决
一般Windows Presentation Foundation (WPF) 项目中不支持xxx都是由于没引用相应的程序集导致,比如Windows Presentation Foundation ( ...
- 洛谷P1129 [ZJOI2007]矩阵游戏 题解
题目链接:https://www.luogu.org/problemnew/show/P1129 分析: 这道题不是很好想,但只要想的出来,代码不成问题. 思路1 举几个例子,我们发现, 对于任何数来 ...