您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

把Maven的架构,用法,坑点介绍的清清楚楚

时间:2021-04-06 17:44:32  来源:今日头条  作者:Java识堂
把Maven的架构,用法,坑点介绍的清清楚楚

 

没有Maven之前的日子

个人的一个小感受,学习一个新技术,应该以历史的眼光开看待这个新技术出现的原因,以及帮我们解决了什么问题。我们来回忆一下没有Maven的日子是怎么样的?

  1. 开发一个项目,需要用别人写好的jar包,我们先把开源的jar包下载下来放到项目的lib目录下,并把这个目录添加到CLASSPATH(告诉JAVA执行环境,在哪些目录下可以找到你要执行的Java程序需要的类或者包)
  2. 我们下载了a.jar发现a.jar还需要依赖b.jar,结果又去把b.jar包下载下来开始运行
  3. 如果运气够好,我们的项目在添加完所有的依赖后,能正产运行了。如果运气差点,还会遇到版本的问题,例如a.jar在调用b.jar的时候发现b.jar根本没有这个方法,在别的版本中才有,现在好了,光找依赖和适配版本就能花上不少时间
  4. 而且我们往git上上传代码的时候,还必须把这些lib都上传上去。别人下载我们的代码时也必须把lib下载下来,这个真心耗费时间

这时候Maven作为Java世界的包管理工具出现了,当然Java世界还有其他包管理工具,例如gradle等。就像yum是linux世界的包管理工具,webpack是前端世界的包管理工具一样

Maven仓库的种类

把Maven的架构,用法,坑点介绍的清清楚楚

 

Maven找jar包的过程是这样的,先在本地仓库找,找不到再去私服(如果配置了的话),再找不到去中央仓库(
http://repo1.maven.org/maven2/,maven团队负责维护)

从中央仓库找到后,会在私服和本地仓库放一份,从私服找到后也会在本地仓库放一份

当你安装在好了Maven以后,在conf目录下有个settings.xml文件,这个里面配置的项很多,后文会详细介绍这个配置文件。

<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->

在这个配置文件下有这样一段话,说了Maven默认的本地仓库地址为${user.home}/.m2/repository(当然你可以重新设置本地仓库的地址,上面就是模板),我是window电脑,来看看这个目录

把Maven的架构,用法,坑点介绍的清清楚楚

 

看到有很多jar包被存到本地,当然如果你想配置私服也是在settings.xml上进行配置,随便一搜很多教程,不再赘述

搭建私服好处多多,在一个公司内部可以开发一些公共的基础组件放到私服上,方便其他同事使用

Maven的默认配置

一个Maven的项目的整体结构是这样的

把Maven的架构,用法,坑点介绍的清清楚楚

 

在这里插入图片描述

为什么一个Maven项目的文件结构是这种的呢?

这就不得不说到Maven的一个特性,约定优于配置。

Maven默认配置了${project.basedir}/src/main/java为项目的源代码目录

${project.basedir}/src/main/test为项目的测试代码目录

${project.basedir}/target为项目的编译输出目录等

spring boot就是约定优于配置的体现,想想我们用spring mvc的时候还得配置视图解析器,包的自动扫描,而用了spring boot框架,我们就完全不用再配置了

Maven项目详解

安装还是挺简单的,我就不再介绍,我也没有单独下载,一般就用了Idea自带的Maven了,下载完后目录结构如下:

把Maven的架构,用法,坑点介绍的清清楚楚

 

bin目录:

该目录包含了mvn运行的脚本,这些脚本用来配置java命令,准备好classpath和相关的Java系统属性,然后执行Java命令。

boot目录:

该目录只包含一个文件,该文件为
plexus-classworlds-2.5.2.jar。plexus-classworlds是一个类加载器框架,相对于默认的java类加载器,它提供了更加丰富的语法以方便配置,Maven使用该框架加载自己的类库。

conf目录:

该目录包含了一个非常重要的文件settings.xml。直接修改该文件,就能在机器上全局地定制maven的行为,即对所有用户都生效。一般情况下,我们更偏向于复制该文件至~/.m2/目录下(~表示用户家目录,windows下~就是C:UsersPeng,Peng是小编的用户名),然后修改该文件,在用户级别定制Maven的行为。

lib目录:

该目录包含了所有Maven运行时需要的Java类库,Maven本身是分模块开发的,因此用户能看到诸如maven-core-3.0.jar、maven-model-3.0.jar之类的文件,此外这里还包含一些Maven用到的第三方依赖如commons-cli-1.2.jar、commons-lang-2.6.jar等等。、

settings.xml配置文件详解

我们来详细说一下settings.xml这个文件,这个文件可以定制Maven的行为,上面已经说到settings.xml可以放在2个位置,~/.m2/setting.xml(默认没有,需要我们自己复制)和${maven.home}/conf/setting.xml

这2个配置文件的加载顺序为~/.m2/setting.xml>${maven.home}/conf/setting.xml,为了不影响他人,所以我们将conf下的settings.xml复制到家目录,在用户级别定制Maven的行为。

把Maven的架构,用法,坑点介绍的清清楚楚

 

这个和配置环境变量有点类似,Windos和Linux都可以配置系统级别的环境变量和用户级别的环境变量,这里单说一下Linux的吧,在/etc/profile里面配置的就是系统级别的环境变量,在~/.bash_profile里面配置的就是用户级别的环境变量

各种配置项还是挺多的,设置镜像仓库(国内用阿里云的比较多),设置代理,不再赘述

maven常用命令

把Maven的架构,用法,坑点介绍的清清楚楚

 

当然也可以连着使用

mvn clean package 清理打包

mvn clean package -DskipTests=true 清理打包,并跳过测试用例

mvn clean install 清理打包,并将jar包或者war包复制到本地仓库

运行单测的时候也没必要一个一个点测试方法,mvn test 一个命令跑完所有测试用例,

要注意的是只会执行以Test开头或者结尾的测试类,也没必要自己写测试类,我在推荐阅读第一篇文章中演示了快速生成测试类的方法,可以去看看,生成的测试类都是以Test结尾的

mvn dependency:tree > show.txt 将依赖输出重定向到文件中,方便查看

pom.xml详解

groupId 公司域名倒过来

artifactId 功能命名

version 版本号

这三个维度确定一个jar包,就像用(x,y,z)坐标在三维空间中唯一确定一个点。

packaging 打包方式,jar,war,maven-plugin(开发maven插件)

scope详解

参数解释是否会被打入最终的jar包compile默认的scope是test测试使用否provided编译需要否runtime编译不需要,运行时需要(接口与实现分离)是system加载本地jar否

类似如下这种,没有指定scope,说明scope是compile

<dependency>
 <groupId>org.mybatis.spring.boot</groupId>
 <artifactId>mybatis-spring-boot-starter</artifactId>
 <version>1.3.2</version>
</dependency>

test是指在运行测试用例的时候才会用到,没必要打入到最后的jar里面,所以你看到的测试框架的scope基本上都是test

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
 <scope>test</scope>
</dependency>

provided,编译的时候会用到,但不会被打入最后的jar包

例如想把spring boot项目以war包的形式放在Tomcat中运行,首先得加入如下依赖

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-tomcat</artifactId>
 <scope>provided</scope>
</dependency>

或者你写了一个放在Storm集群或者Flink集群上运行的任务,最后都要把Storm的依赖或者Flink的依赖设置成provided,因为集群上已经都有这些环境的jar包、

如果你用到lombok插件的话,你会发现lombok的Maven是如下形式,说明它只会编译的时候会用到。

<dependency>
 <groupId>org.projectlombok</groupId>
 <artifactId>lombok</artifactId>
 <version>1.16.6</version>
 <scope>provided</scope>
</dependency>

我写了如下一个测试类

@Data
public class Test {
 private String name;
 private int age;
}

生成的class文件反编译后的如下,验证了我们的想法,编译之后确实没有必要再用lombok这个jar包

public class Test {
 private String name;
 private int age;
 public Test() {
 }
 public String getName() {
 return this.name;
 }
 public int getAge() {
 return this.age;
 }
 public void setName(String name) {
 this.name = name;
 }
 public void setAge(int age) {
 this.age = age;
 }
}

runtime,运行时才会用到。例如,如果你的项目有对数据库的操作,但没有加入相应的JDBC的实现jar包,如MySQL-connector-java,是可以编译成功的,只有运行时才会报错。所以你看到的JDBC实现的jar包scope为runtime,表明这个jar包在运行时才会用到

<dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>5.1.35</version>
 <scope>runtime</scope>
</dependency>

system,本地加载jar,当你和第三方公司合作,他们只是给了你一个jar包时,你可以有三种选择

  1. mvn install到本地仓库
  2. mvn deploy到私服
  3. 指定jar包路径,从本地加载,例如如下pom形式
 <dependency>
 <groupId>com.tievd.third</groupId>
 <artifactId>arcvideo</artifactId>
 <version>1.0</version>
 <scope>system</scope>
 <systemPath>${basedir}/lib/face-api-1.0.jar</systemPath>
</dependency>

前文已经说到scope为system的依赖不会被打入最终的jar包,得通过配置插件等方式将依赖打入最终的jar包,所以这种方式一般很少使用。

还没写完,后续更精彩

本文为小编原创文章,首发于Java识堂,一个高原创,高收藏,有干货的微信公众号,一起成长,一起进步,欢迎关注



Tags:Maven   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
使用Maven Publish Plugin插件。(官方支持)一、在Library的build.gradle中配置plugins { id &#39;com.android.library&#39; id &#39;kotlin-android&#39; id &#39;k...【详细内容】
2021-11-05  Tags: Maven  点击:(36)  评论:(0)  加入收藏
1 注册maven(oss)账号注册地址: https://issues.sonatype.org/secure/Signup!default.jspa 注册成功后登陆到首页2 创建一个Issue Project: 项目类型,一般为Community Suppor...【详细内容】
2021-07-05  Tags: Maven  点击:(99)  评论:(0)  加入收藏
环境:JavaIDEAMaven 多层级架构Jenkins描述:由于架构是 Maven 多层级架构,采用 Jenkins 打包发布的方式对服务部署,与传统的单层架构不同。传统的单层架构直接在 pom.xml 文件层...【详细内容】
2021-06-29  Tags: Maven  点击:(125)  评论:(0)  加入收藏
在项目中使用Maven管理JAR包依赖,往往会出现以下状况:1、国内访问maven默认远程中央镜像特别慢;使用阿里的镜像替代远程中央镜像;2、阿里云镜像中缺少部分JAR包;同时使用私有仓库...【详细内容】
2021-06-16  Tags: Maven  点击:(114)  评论:(0)  加入收藏
groupid 一般定义方式为实际项目名artifactId 一一般表示该项目中的某个某块名version 表示该项目中的某个模块的版本号scope 表示该某个的作用范围,scope的不同值也表示该模...【详细内容】
2021-04-25  Tags: Maven  点击:(258)  评论:(0)  加入收藏
没有Maven之前的日子个人的一个小感受,学习一个新技术,应该以历史的眼光开看待这个新技术出现的原因,以及帮我们解决了什么问题。我们来回忆一下没有Maven的日子是怎么样的? 开...【详细内容】
2021-04-06  Tags: Maven  点击:(278)  评论:(0)  加入收藏
查看maven依赖关系打开maven文件,右键maven -> show dependencies,或者按快捷键CTRL+ALT+SHIFT+U。然后按住Ctrl,滑动鼠标滚轮可以放大和缩小视图。查看某个依赖在视图中双击该...【详细内容】
2021-01-05  Tags: Maven  点击:(340)  评论:(0)  加入收藏
概念什么是MavenMaven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理。Maven 这个单词的本意是:专家,内行。读音是[&lsquo;me...【详细内容】
2020-10-27  Tags: Maven  点击:(49)  评论:(0)  加入收藏
首先来介绍一下nexus这个开发中会用到的服务,Nexus是一个强大的Maven仓库管理器,它极大地简化了自己内部仓库的维护和外部仓库的访问。利用Nexus你可以只在一个地方就能够完全...【详细内容】
2020-09-14  Tags: Maven  点击:(125)  评论:(0)  加入收藏
一、下载安装jdk并配置1.1 进行JDK下载 下载地址:一键直达JDK下载展示图 一般下载后,安装位置默认,一路下一步,一直到安装完毕-“关闭”。1.2 环境变量配置不要管是不是一般情况...【详细内容】
2020-09-03  Tags: Maven  点击:(144)  评论:(0)  加入收藏
▌简易百科推荐
为了构建高并发、高可用的系统架构,压测、容量预估必不可少,在发现系统瓶颈后,需要有针对性地扩容、优化。结合楼主的经验和知识,本文做一个简单的总结,欢迎探讨。1、QPS保障目标...【详细内容】
2021-12-27  大数据架构师    Tags:架构   点击:(3)  评论:(0)  加入收藏
前言 单片机开发中,我们往往首先接触裸机系统,然后到RTOS,那么它们的软件架构是什么?这是我们开发人员必须认真考虑的问题。在实际项目中,首先选择软件架构是非常重要的,接下来我...【详细内容】
2021-12-23  正点原子原子哥    Tags:架构   点击:(7)  评论:(0)  加入收藏
现有数据架构难以支撑现代化应用的实现。 随着云计算产业的快速崛起,带动着各行各业开始自己的基于云的业务创新和信息架构现代化,云计算的可靠性、灵活性、按需计费的高性价...【详细内容】
2021-12-22    CSDN  Tags:数据架构   点击:(10)  评论:(0)  加入收藏
▶ 企业级项目结构封装释义 如果你刚毕业,作为Java新手程序员进入一家企业,拿到代码之后,你有什么感觉呢?如果你没有听过多模块、分布式这类的概念,那么多半会傻眼。为什么一个项...【详细内容】
2021-12-20  蜗牛学苑    Tags:微服务   点击:(8)  评论:(0)  加入收藏
我是一名程序员关注我们吧,我们会多多分享技术和资源。进来的朋友,可以多了解下青锋的产品,已开源多个产品的架构版本。Thymeleaf版(开源)1、采用技术: springboot、layui、Thymel...【详细内容】
2021-12-14  青锋爱编程    Tags:后台架构   点击:(20)  评论:(0)  加入收藏
在了解连接池之前,我们需要对长、短链接建立初步认识。我们都知道,网络通信大部分都是基于TCP/IP协议,数据传输之前,双方通过“三次握手”建立连接,当数据传输完成之后,又通过“四次挥手”释放连接,以下是“三次握手”与“四...【详细内容】
2021-12-14  架构即人生    Tags:连接池   点击:(16)  评论:(0)  加入收藏
随着移动互联网技术的快速发展,在新业务、新领域、新场景的驱动下,基于传统大型机的服务部署方式,不仅难以适应快速增长的业务需求,而且持续耗费高昂的成本,从而使得各大生产厂商...【详细内容】
2021-12-08  架构驿站    Tags:分布式系统   点击:(23)  评论:(0)  加入收藏
本系列为 Netty 学习笔记,本篇介绍总结Java NIO 网络编程。Netty 作为一个异步的、事件驱动的网络应用程序框架,也是基于NIO的客户、服务器端的编程框架。其对 Java NIO 底层...【详细内容】
2021-12-07  大数据架构师    Tags:Netty   点击:(16)  评论:(0)  加入收藏
前面谈过很多关于数字化转型,云原生,微服务方面的文章。虽然自己一直做大集团的SOA集成平台咨询规划和建设项目,但是当前传统企业数字化转型,国产化和自主可控,云原生,微服务是不...【详细内容】
2021-12-06  人月聊IT    Tags:架构   点击:(23)  评论:(0)  加入收藏
微服务看似是完美的解决方案。从理论上来说,微服务提高了开发速度,而且还可以单独扩展应用的某个部分。但实际上,微服务带有一定的隐形成本。我认为,没有亲自动手构建微服务的经历,就无法真正了解其复杂性。...【详细内容】
2021-11-26  GreekDataGuy  CSDN  Tags:单体应用   点击:(35)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条